在NodeJS会话中看不到的原型方法

时间:2014-03-06 07:12:47

标签: javascript node.js session

我正在尝试通过构建一个小游戏来学习Javascript和NodeJS,而我遇到了一个问题。当我将对象附加到会话时,每当我重新访问该会话时,我都无法访问我在其上定义的任何原型方法。

在一个名为24.js的文件中,我有

function Deck() {
    this.cards = [];
    for (var i = 0; i < 52; i++) {
        this.cards[i] = Math.floor(i / 4) + 1;
    }
    this.done = false;
}

function GameState() {
    // holds game state and game logic
    this.time = 0;
    this.score = 0;
    this.deck = new Deck();
    this.deck.deal();
}
Deck.prototype.deal = function() {
    // not that important
}

var gameMaker = exports = module.exports = function() {
    return new GameState();
}

然后在我的主文件中

var express = require('express');
var gameMaker = require('./24.js');

var app = express();
app.use(express.static(__dirname + '/static'));
app.use(express.urlencoded());
app.use(express.cookieParser());
app.use(express.session({
    secret: 'supersecret',
    key: 'express.sid'
}));

app.get('/', function (req, res) {
    if (!req.session.game) {
        req.session.game = gameMaker();
    }
    var game = req.session.game;
    // Access data from game to send to client
});

app.post('/verify', function (req, res) {
    // assumes game exists, check for this later
    var game = req.session.game;
    game.score += 1;
    game.deck.deal();
    res.redirect("/");
});

每当我执行POST时都会收到错误,因为它显示Object #<Object> has no method 'deal'。我检查过,我仍然可以在第一次加载页面时调用deal()方法,我也可以访问其他信息(比如游戏的得分,或者最后处理的卡片。)唯一的事情是break是同一会话上的方法调用。

1 个答案:

答案 0 :(得分:4)

问题在于,通常在请求之间保存会话时,会使用JSON.stringify(req.session)对其进行序列化。这意味着所有对象都转换为普通JS对象,当从JSON解析回来时,对象将不再将其原型设置为Deck.prototype

您不应该在会话中存储复杂的数据结构。而是拥有自己的逻辑来获取/设置正确重新创建套牌所需的会话值。