我目前正在练习nodeJS,我想实现这样的目标:
我正在尝试检查是否存在具有相同session.username的另一个会话。如果是,则显示警告。我是这样做的:
app.post('/login', (req, res) => {
let options = {"username": req.body.username, "error": null};
if(!req.body.username) {
options.error = "username required nobi";
res.render('login', options);
} else if (req.body.username == req.session.username) {
res.redirect('/');
} else {
req.sessionStore.all( (err, sessions) => {
if(!err) {
let isUsed = false;
let i=0;
for(i; i < sessions.length; i++) {
let session = JSON.parse(sessions[i]);
if (session.username == req.body.username) {
err = "name already taken";
isUsed = true;
break;
}
}
}
if (err) {
options.error = err;
res.render('login', options);
} else {
req.session.username = req.body.username;
res.redirect("/");
}
});
}
});
它不起作用:我使用相同的用户名在chrome和IE上连接。我不希望那是可能的
作为说明(如果需要):
{ If9a9SgOoq7roW8Za84CouSEzgqDs1Q3:
{ cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' },
username: 'pseudo' },
MBs41iJmoQpLLCDhP8aFAk5PWAZ_ZQSV:
{ cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' },
username: 'pseudo' } }
答案 0 :(得分:0)
app.post('/login', (req, res) => {
// You can store username in res.locals.username after auth
// It's not necessary to pass it into render.
let username = req.body.username;
if(!username)
return res.render('login', {error: 'username required nobi'});
if (username == req.session.username)
return res.redirect('/');
if (username && username != req.session.username)
return ... // maybe destroy current session?
req.sessionStore.all( (err, sessions) => {
if (err)
return res.render('login', {error: err.message});
let isUsed = Object.keys(sessions).some((id) => sessions[id].username == username);
if (isUsed)
return res.render('login', {error: 'Already used'});
req.session.username = username;
res.locals.username = username;
res.redirect('/');
});
});