我使用的是Express、Node.js和Mongo。为了减少噪音,我从实际代码中简化了一些代码,我希望这是有意义的。
我的基本问题是,我正在修改一个对象,并且我期望数据更改在客户机-服务器调用中持续存在,但事实并非如此。注释解释了更多。
// server side routes.js
var LM = require('./modules/login-manager'); // database accessing functions
var DM = require('./modules/data-manager'); // database accessing functions
module.exports = function (app) {
app.post('/', function (req, res) {
// LM.manualLogin does a MongoDB call that looks fine, returns the expected data
LM.manualLogin(req.body['user'], req.body['pass'], function (e, o) {
if (!o) {
res.status(400).send(e);
} else {
req.session.user = o;
// calculateRank adds arbitrary fields to the user object
// this change persists to POST /dashboard
calculateRank(req.session.user);
// DM.getListOfData() does a Mongo DB call that looks fine
// and returns the expected data in o
DM.getListOfData(function (e, o) {
if (!o) {
res.status(400).send(e);
} else {
// availableData doesn't already exist. This assignment
// operation looks good
// in the debugger, but "availableData" is NOT in the
// req.session when we get to POST /dashboard
req.session.availableData = o;
}
});
res.status(200).send(o);
}
});
});
app.get('/dashboard', function (req, res) {
if (req.session.user == null) {
res.redirect('/');
}
else {
// "availableData" is not there!
// but changes to req.session.user are
res.render('dashboard', {
user: req.session.user,
data: req.session.availableData
});
}
});
}
// client side
$('#login').ajaxForm({
beforeSubmit: function (formData, jqForm, options) {
formData.push({
name: 'remember-me',
value: $('.button-rememember-me-glyph').hasClass('glyphicon-ok')
});
return true;
},
success: function (responseText, status, xhr, $form) {
if (status == 'success') window.location.href = '/dashboard';
},
error: function (e) {
// login error
}
});因此,我单击驱动客户端ajax功能的登录按钮。服务器端,我得到POST /,当返回时,客户端重定向到/dashboard。问题是服务器端,在POST /dashboard中,我丢失了一些数据。我真正不明白的是,"req.session.user = o;“和"calculateRank(req.session.user)”设置的数据仍然存在。由"req.session.availableData = o;“设置的数据没有,在POST /dashboard中,就好像操作从未发生过一样(但其他两个操作却发生了)。调试该赋值操作时,它看起来很好,并且可以在req对象中看到数据。
有人能帮我解释一下吗?谢谢!
发布于 2017-03-26 12:11:27
您正在发送响应,res.status(200).send(o);,在req.session.availableData = o;有时间运行之前,因为是异步操作。
在getListOfData回调中发送响应将解决问题。
https://stackoverflow.com/questions/43028432
复制相似问题