【问题标题】:Save before req.session.destroy() ExpressJS在 req.session.destroy() ExpressJS 之前保存
【发布时间】:2014-03-09 11:29:04
【问题描述】:

我想在注销路径中销毁会话之前将会话值“图像位置”保存到数据库中

我采用的解决方案是:

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();
                }

                }       

            });
});

但是当我使用这个获取位置路由时,任务就完成了,即更新了 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

P.S: /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)

【问题讨论】:

    标签: javascript node.js mongodb session express


    【解决方案1】:

    您是否尝试过保存

    'req.session.userimage[req.session.img_idx]' 在某些 var 中使用前?

    例如:

    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_name, uImage = req.session.userimage[req.session.img_idx]; Person.update({ username: uName }, { $set: {lastimage: uImage}}, function(error,update) { if(update){ req.session.destroy(function() { res.end(); } ); if(error){ //console.log(error); res.end(); } } });它可以工作,直到现在没有错误,谢谢..如果存在问题,我会选择第二个选项:)
    • 很高兴听到这个消息。 (;
    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多