我已经创建了一个基本的网站,其中包含nodejs和express,需要一个会话系统,所以我使用了快速会话来做到这一点。问题是我的会话没有通过我网站的不同页面保存,似乎在登录完成后直接删除了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);
因此,当用户登录成功时,mainpage.html正确显示(字段userid正确字段为req.session.user.userid),但是当我点击其他页面(例如profilpage)或者我来的时候回到主页,会话未保存,用户标识字段不正确。 我还想提一下if(req.session.user)子句 在/ mainpage不起作用,其他似乎从未使用过。
(mongodb数据库和html文件是正确的)
谢谢。
答案 0 :(得分:0)
删除'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
}