【发布时间】:2018-04-14 11:59:28
【问题描述】:
我已经用 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);
所以当用户登录成功时,mainpage.html 会正确显示(字段 userid 是正确的字段,带有 req.session.user.userid),但是当我点击另一个页面时,比如 profilepage 或者我来了返回主页,会话未保存且用户 ID 字段不正确。 我还想提一下 if (req.session.user) 子句 in /mainpage 不起作用,else 似乎从未使用过。
(mongodb数据库和html文件正确)
谢谢。
【问题讨论】:
-
我会说,当您进行 mongodb 查询并将其存储在 user 中时,它可能是一个数组,即使有一个项目,所以您必须指向该数组中的索引。执行查询后执行 console.log(user) 并将其发布到此处。
-
摆脱
var user = dbo.collection().findOne()中的var user=。这是错误的和误导的。可能不会导致您的问题,但肯定是错误的。 -
是的,当然var用户绝对没用它真的很愚蠢,日志是{_id:5ace4b3a86160808612c34df,name:'Test',surname:'Test',userid:'Test',pwd:'测试',邮件:'test@gmail.com',年龄:'1',性别:'未定义'}
标签: node.js express session express-session