我正在尝试在Express会话中保存用户的用户名。它将变量保存在会话中,但它将下一个请求的undefined
返回到路由。但是,问题仅在邮局中。
有了获取请求,我可以保存会话变量,并且不会在进一步的请求中被破坏。我想我一定做错了。我尝试了save()
的邮政方法,但仍然只节省了第一次,下次它消失了。
这是代码:
app.use(session({
secret: 'some secret',
resave: true,
saveUninitialized: true,
cookie: {
maxAge: 36000000,
httpOnly: false
},
}));
以下获取路线可行。
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();
});
}
});
});
我做错了什么?
,因为它是 Javascript
,您应该使用===
而不是==
检查质量,并且为了更好地响应时间发布连接,然后再连接到它,这是不必要的,当您具有连接到连接到connectionPool
只需从中查询两次,然后发布连接即可。
这是示例修改的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();
}
});
});