【问题标题】:Can't save express session in NodeJs无法在 NodeJs 中保存快速会话
【发布时间】:2017-11-26 12:12:32
【问题描述】:

我正在尝试将用户的用户名保存在快速会话中。它将变量保存在会话中,但在下次请求路由时返回undefined。但是,问题仅在于 POST 路由。

通过 GET 请求,我可以保存会话变量,并且它不会在进一步的请求中被破坏。我想我一定做错了什么。我尝试了save() POST 方法,但它仍然只保存第一次,下次它就消失了。

代码如下:

app.use(session({
  secret: 'some secret',
  resave: true,
  saveUninitialized: true,
  cookie: {
    maxAge: 36000000,
    httpOnly: false
  },
}));

遵循 GET 路线工程。

app.get("/test", function(req, res, next){
    if(!req.session.name){
        req.session.name = "vikas kumar";
    } else {
        console.log(req.session.name);
    }
    res.end();
});

app.use(function (req, res, next) {
  var userName = req.session.userName;
  // console.log(req.session.userName);
  if(userName && userName != 'undefined'){
    res.send({status: "success", value: userName});
  } else {
    if(req.path == '/checkIfLoggedIn'){
        res.send({status: "error", message: "Session ended."});
    } else {
        next('route');
    }
  }
});

按照路线只保存一次会话。

app.post('/getProfile', function (req, res, next) {
    console.log("Session", req.session.userName, req.session.name);
    if(typeof req.session.userName != 'undefined'){
        var userName = req.session.userName;
    } else {
        var userName = req.body.userName;
    }
   connectionPool.getConnection(function (err, connection) {
        if (err) {
            res.send({status: "error", message: err});
        } else {
        connection.query("SELECT * FROM cs_chat.users WHERE username=?", [userName], function (err, rows, fields) {
            if(rows.length==1){
                // console.log(">>>", req.session.userName);
                req.session.userName = userName;
                req.session.save();
                // console.log("<<<", req.session.userName);
                next();
            }else{
                res.send({status: "error", message: "Sorry, you're not registered."});
            }
            connection.release();

        });

        }
    });
}, function (req, res) {
    connectionPool.getConnection(function (err, connection) {
        if (err) {
            res.send({status: "error", message: err});
        } else {
            req.session.username = req.body.userName;
            req.session.save();
        connection.query("SELECT usr.username, usr.name, tsn.sender, CASE WHEN tsn.unseen is not null THEN tsn.unseen ELSE 0 END as unseen, tsn.receiver FROM users usr LEFT JOIN (SELECT sender, receiver, SUM(CASE WHEN seen = 0 THEN 1 ELSE 0 END) AS unseen FROM messages WHERE receiver = ? GROUP BY sender , receiver) tsn ON usr.username = tsn.sender where usr.username!=?", [req.body.userName, req.body.userName], function (err, rows, fields) {
            if(rows.length>0){
                res.send({status: "success", values: rows});
            }else{
                res.send({status: "success", values: []});
            }
            connection.release();
        });

        }
    });
});

我做错了吗?

【问题讨论】:

  • 在您的POST 请求中,您没有保存会话,以便稍后在其他受限路由中从其中检索用户名。看到这个类似的SO question
  • 但是save()方法我已经写好了?
  • 首先你能告诉我你为什么要使用两个function,当你只能在单个函数中执行上述操作时,连接到connectionPool只会增加服务器的响应时间和在第一个function(req, res, next) 为什么你使用next() 它不是必需的。
  • 并且由于它是 javascript,因此您使用 == 检查是否相等,而应该使用 === 检查它,这可能是原因之一。比如if(rows.length==1)应该是if(rows.length===1)

标签: node.js session express express-session


【解决方案1】:

既然是Javascript,你应该用===而不是==来检查质量,并且为了更好的响应时间释放连接然后再次连接它,当你连接到@987654325时,这是完全没有必要的@ 只需从它查询两次,然后释放连接。

这是修改app.post()..请求的示例,这应该可以工作:

    app.post('/getProfile', function (req, res, next) {
    console.log("Session", req.session.userName, req.session.name);
    var userName = (req.session.userName !== undefined) ? req.session.userName : req.body.userName;

    connectionPool.getConnection(function (err, connection) {
        if (err) {
            res.send({ status: "error", message: err });
        } else {
            connection.query("SELECT * FROM cs_chat.users WHERE username=?", [userName], function (err, rows, fields) {
                if (rows.length === 1) {
                    req.session.userName = userName;
                    req.session.save();
                } else {
                    res.send({ status: "error", message: "Sorry, you're not registered." });
                }
            });
            connection.query("SELECT usr.username, usr.name, tsn.sender, CASE WHEN tsn.unseen is not null THEN tsn.unseen ELSE 0 END as unseen, tsn.receiver FROM users usr LEFT JOIN (SELECT sender, receiver, SUM(CASE WHEN seen = 0 THEN 1 ELSE 0 END) AS unseen FROM messages WHERE receiver = ? GROUP BY sender , receiver) tsn ON usr.username = tsn.sender where usr.username!=?",
                [req.body.userName, req.body.userName],
                function (err, rows, fields) {
                    if (rows.length > 0) {
                        res.send({ status: "success", values: rows });
                    } else {
                        res.send({ status: "success", values: [] });
                    }
                });
            connection.release();
        }
    });
});

【讨论】:

  • 不确定是否能彻底解决问题,但这肯定是问题之一
  • 在发布请求时,您可以在控制台输出中看到req.session.userName 吗?
  • 离开帖子,实际上它甚至不适用于 GET 请求。我在这里再次解释了我的问题。请查收:stackoverflow.com/questions/44745218/…
猜你喜欢
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2018-08-04
  • 2015-07-05
  • 2020-04-07
相关资源
最近更新 更多