Javascript 在请求之前保存session.destroy()ExpressJS

Javascript 在请求之前保存session.destroy()ExpressJS,javascript,node.js,mongodb,session,express,Javascript,Node.js,Mongodb,Session,Express,我想在注销路由中销毁会话之前,将会话值“image location”保存到数据库中 我采取的解决办法是: app.get('/logout',function(req,res){ Person.update({ username: req.session.user_name }, { $set: {lastimage: req.session.userimage[req.session.img_idx]}}, function(error,update) {

我想在注销路由中销毁会话之前,将会话值“image location”保存到数据库中

我采取的解决办法是:

app.get('/logout',function(req,res){

    Person.update({ username: req.session.user_name }, { $set: {lastimage: req.session.userimage[req.session.img_idx]}}, function(error,update)
            {
                if(update){ 
                req.session.destroy(function() {
                     res.end();
                });
                if(error){
                    console.log(error);
                    res.end();
                }

                }       

            });
});
但是当我使用这个get location路由时,任务完成了,即person db中的值被更新了,但是作为回报,出现了一些奇怪的错误

TypeError: Cannot read property 'undefined' of undefined
    at options.key (/opt/expressjs/app.js:381:94)
    at callbacks (/opt/expressjs/node_modules/express/lib/router/index.js:164:37)
    at param (/opt/expressjs/node_modules/express/lib/router/index.js:138:11)
    at pass (/opt/expressjs/node_modules/express/lib/router/index.js:145:5)
    at Router._dispatch (/opt/expressjs/node_modules/express/lib/router/index.js:173:5)
    at Object.router (/opt/expressjs/node_modules/express/lib/router/index.js:33:10)
    at next (/opt/expressjs/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at resume (/opt/expressjs/node_modules/express/node_modules/connect/lib/middleware/static.js:65:7)
    at SendStream.error (/opt/expressjs/node_modules/express/node_modules/connect/lib/middleware/static.js:80:37)
    at SendStream.EventEmitter.emit (events.js:95:17)
为什么会这样。我正在使用ExpressJs会话和mongodb

附:行/opt/expressjs/app.js:381:94是

Person.update({ username: req.session.user_name }, { $set: {lastimage: req.session.userimage[req.session.img_idx]}}, function(error,update)
你试过存钱吗

在使用之前,在某些变量中使用'req.session.userimage[req.session.img_idx]

例如:

var uName = req.session.user_name,
    uImage = req.session.userimage[req.session.img_idx];

Person.update({ username: uName }, { $set: {lastimage: uImage }}, function(error,update) { ...
顺便说一句,您可能会调用res.end()两次,这会让事情变得奇怪

编辑:

app.get('/logout', function(req,res) {

    var uName  = req.session.user_name,
        uImage = req.session.userimage[req.session.img_idx];

    Person.update({ username: uName }, { $set: {lastimage: uImage }}, function(error,update) {

        if(error)
            console.log(error);

        // This actually destroys the session
        delete req.session;
        res.end();
    });
});

是的,我试过了,它也给了一些时间没有错误,有些时间错误。这两种解决方案都是一样的。有时响应是200,有时是500,但在这两个时间任务,即数据库更新完成。我认为这是异步行为的问题,我没有很好地理解。而且路由是在数据库更新之前首先删除的,但是如果是这个问题,那么为什么要在删除之前用正确的值更新数据库。我用更好的解决方案编辑了响应。你能试试它是否有效吗?当我使用…var uName=req.session.user\u name,uImage=req.session.userimage[req.session.img\u idx];更新({username:uName},{$set:{lastimage:uImage}}),函数(错误,更新){if(更新){req.session.destroy(函数(){res.end();});if(错误){//console.log(错误);res.end();});它工作正常,现在没有错误,谢谢。。如果问题存在,我将选择第二个选项:)很高兴听到这个消息。(;