这个JavaScript对象修改是如何工作的?我不明白范围,它不会持续存在



我正在使用Express,Node.js和Mongo DB。我已经从我的实际代码中简化了这段代码,以尝试消除噪音,我希望它是有意义的。

我的基本问题是我正在修改一个对象,并且我希望数据更改在客户端-服务器调用中持续存在,但事实并非如此。评论解释了更多。

// 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 对象中的数据。

谁能帮我解释一下?谢谢!

你在req.session.availableData = o;有时间运行之前发送响应,res.status(200).send(o);,因为它是异步操作

getListOfData回调中发送响应可以解决您的问题。

最新更新