快速会话身份验证和分配变量
Express session authentification and assigning variables
我遇到了奇怪的问题。相信对于有经验的人来说是非常简单的。
在 Node.js+Express+NeDB
上制作本地 Web 服务器
客户端登录时向 /login
表单发出 POST 请求,并在成功登录后重定向。
{"id":1,"created":1568146217901,"username":"sprice","name":"Steve Price","email":"email@gmail.com","password":"Password","level":"1","_id":"3JDE7p6tAl1vD11k"}
登录 post
// POST services
app.post('/login', (req, res) => {
const loginData = req.body;
db.users.findOne({ username: loginData.uname }, function (err, doc) {
req.session.userId = doc.id;
if(doc.id === 1) console.log("True"); // < Output: True
console.log(req.session.userId); // < Output: 1
});
req.session.userId = 1; // < Just for test
res.redirect('/plan');
});
在进入 /plan
页面之前有一个身份验证检查:
const redirectLogin = (req, res, next) => {
const { userId } = req.session;
console.log(userId); // < Output: undefined
if (!userId) {
res.render('pages/index');
} else {
next()
}
}
所以我的奇怪问题是,如果我从 DB 中分配整数值并测试我是否有 if 语句,我得到 req.session.userId = 1
,但是当客户端被重定向时它的 req.session.userId = undefined
。
但是,如果我用该测试线手动分配值,它就可以工作并且服务器发出 cookie,我可以毫无问题地访问我的网站......
我做错了什么吗?
您没有注意到 .findOne()
的回调是 异步的 和 非阻塞。这意味着您的请求处理程序首先 returns 然后然后,稍后(在 res.redirect()
已经发送之后),回调被调用。因此,回调对于重定向来说为时已晚。相反,您需要在回调中执行 res.redirect()
:
// POST services
app.post('/login', (req, res) => {
const loginData = req.body;
db.users.findOne({ username: loginData.uname }, function (err, doc) {
if (err) {
console.log(err);
res.sendStatus(500);
return;
}
req.session.userId = doc.id;
if(doc.id === 1) console.log("True"); // < Output: True
console.log(req.session.userId); // < Output: 1
res.redirect('/plan');
});
});
根据您使用的会话存储,您可能还必须在重定向之前保存对会话的任何更改。
我遇到了奇怪的问题。相信对于有经验的人来说是非常简单的。
在 Node.js+Express+NeDB
上制作本地 Web 服务器客户端登录时向 /login
表单发出 POST 请求,并在成功登录后重定向。
{"id":1,"created":1568146217901,"username":"sprice","name":"Steve Price","email":"email@gmail.com","password":"Password","level":"1","_id":"3JDE7p6tAl1vD11k"}
登录 post
// POST services
app.post('/login', (req, res) => {
const loginData = req.body;
db.users.findOne({ username: loginData.uname }, function (err, doc) {
req.session.userId = doc.id;
if(doc.id === 1) console.log("True"); // < Output: True
console.log(req.session.userId); // < Output: 1
});
req.session.userId = 1; // < Just for test
res.redirect('/plan');
});
在进入 /plan
页面之前有一个身份验证检查:
const redirectLogin = (req, res, next) => {
const { userId } = req.session;
console.log(userId); // < Output: undefined
if (!userId) {
res.render('pages/index');
} else {
next()
}
}
所以我的奇怪问题是,如果我从 DB 中分配整数值并测试我是否有 if 语句,我得到 req.session.userId = 1
,但是当客户端被重定向时它的 req.session.userId = undefined
。
但是,如果我用该测试线手动分配值,它就可以工作并且服务器发出 cookie,我可以毫无问题地访问我的网站......
我做错了什么吗?
您没有注意到 .findOne()
的回调是 异步的 和 非阻塞。这意味着您的请求处理程序首先 returns 然后然后,稍后(在 res.redirect()
已经发送之后),回调被调用。因此,回调对于重定向来说为时已晚。相反,您需要在回调中执行 res.redirect()
:
// POST services
app.post('/login', (req, res) => {
const loginData = req.body;
db.users.findOne({ username: loginData.uname }, function (err, doc) {
if (err) {
console.log(err);
res.sendStatus(500);
return;
}
req.session.userId = doc.id;
if(doc.id === 1) console.log("True"); // < Output: True
console.log(req.session.userId); // < Output: 1
res.redirect('/plan');
});
});
根据您使用的会话存储,您可能还必须在重定向之前保存对会话的任何更改。