我正在使用Express和socket.io在NodeJS中创建一个多人游戏。大多数后端都在工作,现在我正在尝试创建前端。
真的在努力做以下事情:
玩家首次打开网站>在数据库中创建一个玩家并记住玩家。 当玩家再次来到时,我们应该读取cookie并再次登录玩家。
到目前为止我的代码:
// app.js
app.get('/', function(req, res){
if(!req.signedCookies.player) {
var Player = new player();
Player.on('playerLoaded', function(err, result) {
if(result) {
res.cookie('player', Player.id.toString(), { signed: true});
}
});
} else {
console.log(req.signedCookies.player);
}
res.render('index', { title: 'My Game' });
});
此行显示错误:发送后无法设置标题。
res.cookie('player', Player.id.toString(), { signed: true});
在这条线上有什么好处:
Player.prototype.createPlayer = function () {
var self = this;
// we only need a datetime to insert
connection.query("INSERT INTO players SET `created_at` = now()", function (err, result) {
process.nextTick(function () {
if(result) {
console.log("Successfully created player no. " + result.insertId);
self.id = result.insertId;
self.emit('playerLoaded', false, true);
} else {
console.log("Trouble inserting a new player");
self.emit('playerLoaded', true, false);
}
});
});
};
然后确切的错误就是在这一行上讨厌:
self.emit('playerLoaded', false, true);
所以我的问题是:
答案 0 :(得分:1)
Cookie是响应标头的一部分。必须先将设置为,然后再write()
调用res.write()
。这就是错误的原因。在第一次res.writeHead()
或// app.js
app.get('/', function(req, res){
if(!req.signedCookies.player) {
var Player = new Player();
Player.on('playerLoaded', function(err, result) {
if(result) {
res.cookie('player', Player.id.toString(), { signed: true});
}
res.render('index', { title: 'My Game' });
});
} else {
res.render('index', { title: 'My Game' });
console.log(req.signedCookies.player);
}
});
调用之前设置Cookie以修复错误。
此代码应该适合您。
{{1}}
答案 1 :(得分:1)
在实现创建新播放器并将其保存在cookie中的目标方面,我是否至少朝着正确的方向前进?如果没有,有人可以帮助我吗?
不确定您的设计。保存对播放器的引用可能会使您很容易以不同的播放器身份登录,具体取决于您识别它们的方式。进行某种会话管理,然后将用户会话与某个播放器链接起来可能更安全。
如果问题是真的,为什么会出错?
因为创建一个播放器是异步的 - 你正在挂钩playerLoaded
回调。这意味着res.render
会在res.cookie
之前立即调用{ - 1}},因此在您尝试设置Cookie标头之前,已经编写了响应正文(并且标题已发送)。
答案 2 :(得分:0)
这解决了我发送的标头的初始问题。还改为使用会话代码。
if(!req.session.player) {
var Player = new player();
Player.on('playerLoaded', function(err, result) {
if(result) {
req.session.player = Player;
res.render('index', { title: 'My Game' });
}
});
} else {
console.log(req.session.player);
res.render('index', { title: 'My Game' });
}