快速会话不通过页面持久化



我用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
}

最新更新