这个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 } }); 

所以我点击我的loginbutton,驱动客户端Ajaxfunction。 服务器端,我得到的POST /,当返回时,客户端redirect到/仪表板。 问题是服务器端,在POST /仪表板中的一些数据丢失。 我真的不明白的是由“req.session.user = o;”设置的数据 和“calculateRank(req.session.user)”仍然存在。 由“req.session.availableData = o;”设置的数据 不会,在POST /仪表板中,就好像操作从未发生过(但其他两次都是这样)。 当我debugging分配操作时,它看起来很好,我可以看到req对象中的数据。

任何人都可以帮我解释一下吗? 谢谢!

你发送回应, res.status(200).send(o); ,之前req.session.availableData = o; 有时间来运行,因为这是一个asynchronous操作

getListOfDatacallback中发送响应可以解决您的问题。