我用nodejs和express做了一个基本的网站,需要一个会话系统,所以我使用express-session来做到这一点。问题是我的会话没有通过我网站的不同页面保留,似乎在登录完成后直接删除了 req.session。这是我的代码(只是重要的部分(:
var express = require('express');
var consolidate = require('consolidate');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mydb";
var bodyparser = require('body-parser');
var session = require('express-session');
//var MongoStore = require('connect-mongo')(session);
var app = express();
app.engine('html', consolidate.swig);
app.set('view engine', 'html');
app.use(express.static(__dirname + '/views'));
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({extended:true}));
app.use(session({
secret: "stfkjvctygf",
resave : false,
saveUninitialized : true,
cookie: { secure: false, maxAge: 1800000 }
}));
app.post('/login',function(req,res,next){
MongoClient.connect(url, function(err, db){
if(err) throw err;
var dbo=db.db("testdb");
var user=dbo.collection("login").findOne({userid : req.body.userid, pwd : req.body.pwd}, function(err, user){
if(err) throw err;
if (user) {
req.session.user = user;
req.session.save(function() {
console.log("current user session: "+req.session.user.userid);
res.render('mainpage.html', {userid: req.session.user.userid});
});
}
else {
console.log("connection failed");
res.render('login.html', {error: 'Invalid username or password'});
}
db.close();
});
});
});
app.get('/mainpage', function(req,res,next) {
if (req.session.user) {
res.render('mainpage.html', {userid: req.session.user.userid});
}
else {
return res.status(401).send();
}
});
app.get('/profilpage', function(req,res,next){
res.render('profilpage.html', {userid: req.session.user.userid});
});
app.listen(8080);
因此,当用户登录成功时,主页.html会正确显示(字段 userid 正确显示 req.session.user.userid(,但是当我单击另一个页面(如 profilpage(或如果我返回主页时,会话不会保存并且 userid 字段不正确。我还想提一下 if (req.session.user( 子句在/mainpage 中不起作用,其他似乎从未使用过。
(mongodb 数据库和 html 文件是正确的(
谢谢。
删除"var user =",因为不需要将查询分配给变量,因为它对返回的数据使用回调。
dbo.collection("login").findOne({userid : req.body.userid, pwd : req.body.pwd}, function(err, user){
if(err) throw err;
console.log(user) //It is most likely an array. Then use index to point the session to the username as such req.session.user = user[0].username
if (user) {
req.session.user = user;
req.session.save(function() {
console.log("current user session: "+req.session.user.userid);
res.render('mainpage.html', {userid: req.session.user.userid});
});
}
else {
console.log("connection failed");
res.render('login.html', {error: 'Invalid username or password'});
}
此外,'if(user(' 是一个不好的做法,因为如果 mongodb 返回一个空数组,则该条件仍然为真,因此会导致逻辑错误。最好做一些类似的事情
if(data.length > 0){
//your code here. data is what is returned from your mongo Query
}