【问题标题】:express-session not persisting through pages快速会话不通过页面持续存在
【发布时间】: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


【解决方案1】:

删除 '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
}

【讨论】:

  • 如果这个答案是正确的,你能接受这个答案吗?如果没有,请告诉我,以便我找出另一种解决方案。谢谢
  • 虽然var user = 肯定是错误的,但我认为它实际上并没有修复任何东西来删除它,因为回调function(err, user) 中的user 覆盖了其他user 定义。跨度>
  • 是的,没错,他可以把它改成数据,所以'function (err,data)
  • 谢谢。是的,做一个 var 用户是绝对错误的,我不知道我为什么这样做,我只是删除了它,我还更改了 if(user)。但问题仍然存在。可能与使用post有关,与get方法无关。
  • 我试过但得到一个错误:ReferenceError: userid is not defined。所以我使用了 req.session.user = user.userid 和 req.session.user = req.body.userid 但问题仍然存在,会话不是持久的。
猜你喜欢
  • 2017-12-28
  • 1970-01-01
  • 2016-04-12
  • 2012-01-10
  • 2021-12-10
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多