Я пытаюсь сохранить имя пользователя пользователя в экспресс-сеансе. Он сохраняет переменную в сеансе, но возвращает undefined
при следующем запросе к маршруту. Однако проблема связана только с маршрутом POST.
С запросом GET я могу сохранить переменную сеанса, и она не будет уничтожена при дальнейших запросах. Я думаю, что я должен делать что-то неправильно. Я попробовал метод save()
для POST, но все же он сохраняется только в первый раз, а в следующий раз он исчезает.
Вот код:
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();
});
}
});
});
Я делаю что-то неправильно?
POST
вы не сохраняете сеанс, чтобы позже сформируйте его, чтобы имя пользователя можно было получить из него позже на других ваших ограниченных маршрутах. См. аналогичный SO вопрос - person warl0ck   schedule 23.06.2017save()
метод? - person Vikas   schedule 23.06.2017function
, когда вы можете сделать вышеперечисленное только в одной функции, подключение кconnectionPool
просто увеличит время отклика сервера, а в первомfunction(req, res, next)
почему вы используетеnext()
это не так? требуется. - person warl0ck   schedule 23.06.2017==
вместо этого вы должны проверять его с помощью===
, это может быть одной из причин. вродеif(rows.length==1)
должно бытьif(rows.length===1)
- person warl0ck   schedule 23.06.2017