gpt4 book ai didi

javascript - 在 NodeJS session 中看不到原型(prototype)方法

转载 作者:搜寻专家 更新时间:2023-10-31 23:13:22 24 4
gpt4 key购买 nike

我试图通过构建一个小游戏来学习 Javascript 和 NodeJS,但我遇到了问题。当我将对象附加到 session 时,无论何时重新访问该 session ,我都无法再访问我在其上定义的任何原型(prototype)方法。

在一个名为 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()在我第一次加载页面时使用方法,我还可以访问其他信息(例如游戏得分,或最后发的牌。)唯一中断的是同一 session 中的方法调用。

最佳答案

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

您不应在 session 中存储复杂的数据结构。取而代之的是使用您自己的逻辑来获取/设置正确重新创建套牌所需的 session 值。

关于javascript - 在 NodeJS session 中看不到原型(prototype)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22217603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com