快递会话未通过网页

时间:2018-04-13 19:50:54

标签: node.js express session express-session

我已经创建了一个基本的网站,其中包含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文件是正确的)

谢谢。

1 个答案:

答案 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
}