我試圖在快速會話中保存用戶的用戶名。它在會話中保存變量,但在下一次路由請求時返回undefined
。但是,問題僅限於POST路由。無法在NodeJs中保存快速會話
使用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問題](https://stackoverflow.com/q/26531143/3521116) – warl0ck
但我已經寫了'save()'方法? –
首先你能告訴我爲什麼你只能在單一函數中使用兩個'function',連接到'connectionPool'只會增加服務器的響應時間和第一個'function(req ,res,next)'爲什麼你使用'next()'這不是必需的。 – warl0ck