无法将用户存储在Express.js会话中

时间:2018-08-28 09:39:09

标签: javascript node.js express

我有此代码:

    app.post('/api/command', function (req, res, next) {
    var clientCommand = req.body.command;

    console.log("ClientCommand: ", clientCommand);
    if (!req.session.step || req.session.step === EMAIL) {

        // find user in db with email
        users.findOne({email: clientCommand}, function (err, result) {
            if (err) {
                return console.log("error: ", err);
            }
            console.log("result: ", result.email);

            // if user exists add user in session
            if (result != null) {
                req.session.user = result;
            }
        });//.catch(console.log);

        console.log("session outside: ", req.session.user);
        // change step to password
        req.session.step = PASSWORD;

    }

问题是我想在users.findOne(...)之外访问req.session.user。但是输出是:

ClientCommand:  example@gmail.com
session outside:  undefined

任何帮助将不胜感激。

P.S。另外,我想知道Express-Session的工作原理以及它如何将数据存储在Cookie(或服务器端)中。

1 个答案:

答案 0 :(得分:0)

Findone是一个异步命令,由于该命令您无法定义。

即使您会注意到 “外部会话:”优先 只有在“结果:”控制台出现之后。

因此,如果您必须在findone内部移动代码或使用可在其中执行查询的自定义中间件。

在调用路由之前在应用js中使用这种类型的代码

app.use(function(req,res,next){
    users.findOne({email: clientCommand}, function (err, result) {
            if (err) {
                return console.log("error: ", err);
            }
            console.log("result: ", result.email);

            // if user exists add user in session
            if (result != null) {
                req.session.user = result;
                next(); // After setting user ,  route will call 
            }else{
                next(); // will allow to go to route even if no user found
            }

        });//.catch(console.log);

})

如果您想在特定的网址上调用它,请使用

app.use(“ [您的网址]”,函数(req,res,next){