我正在尝试通过构建一个小游戏来学习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是同一会话上的方法调用。
答案 0 :(得分:4)
问题在于,通常在请求之间保存会话时,会使用JSON.stringify(req.session)
对其进行序列化。这意味着所有对象都转换为普通JS对象,当从JSON解析回来时,对象将不再将其原型设置为Deck.prototype
。
您不应该在会话中存储复杂的数据结构。而是拥有自己的逻辑来获取/设置正确重新创建套牌所需的会话值。