【发布时间】: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