экспресс-сессия не сохраняется на страницах

Я сделал базовый веб-сайт с nodejs и экспрессом, которому нужна система сеансов, поэтому для этого я использовал экспресс-сеанс. Проблема в том, что мой сеанс не сохраняется на разных страницах моего веб-сайта, похоже, что 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), но когда я нажимаю на другую страницу, такую ​​​​как профильная страница, или если я возвращаюсь к mainpage, сессия не сохраняется, а поле userid неверно. Я также хочу отметить, что предложение if (req.session.user) в /mainpage не работает, а else, кажется, никогда не используется.

(база данных mongodb и файлы html верны)

Спасибо.


person Spiicyz    schedule 13.04.2018    source источник
comment
Я бы сказал, что когда вы выполняете запрос mongodb и сохраняете его в user , это, вероятно, массив, даже если есть один элемент, поэтому вам нужно указать индекс в этом массиве. Сделайте console.log(user) после того, как вы сделаете запрос, и опубликуйте его здесь, что вы получите.   -  person AmirHossein Rd    schedule 14.04.2018
comment
Избавьтесь от var user= в var user = dbo.collection().findOne(). Это неправильно и вводит в заблуждение. Вероятно, это не является причиной вашей проблемы, но определенно неправильно.   -  person jfriend00    schedule 14.04.2018
comment
Да, конечно, пользователь var абсолютно бесполезен, это действительно глупо, лог: { _id: 5ace4b3a86160808612c34df, имя: 'Test', фамилия: 'Test', userid: 'Test', pwd: 'test', mail: 'test@ gmail.com», возраст: «1», пол: «не определено» }   -  person Spiicyz    schedule 14.04.2018


Ответы (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
}
person AmirHossein Rd    schedule 13.04.2018
comment
если этот ответ правильный, можете ли вы принять ответ? если нет, пожалуйста, дайте мне знать, чтобы я мог найти другое решение. Спасибо - person AmirHossein Rd; 14.04.2018
comment
Хотя var user = определенно неверен, я не думаю, что на самом деле это что-то исправляет, чтобы удалить его, потому что user в обратном вызове function(err, user) переопределяет другое определение user. - person jfriend00; 14.04.2018
comment
Да, это правда, он может просто изменить его на данные, так что «функция (ошибка, данные) - person AmirHossein Rd; 14.04.2018
comment
Спасибо. Да, делать пользователя var абсолютно неправильно. Я не знаю, почему я это сделал, я просто удалил его, а также изменил if (user). Но проблема все еще существует. Возможно, это связано с использованием сообщения, а не метода получения. - person Spiicyz; 14.04.2018
comment
Я попытался, но получил ошибку: ReferenceError: userid не определен. Поэтому я использовал req.session.user = user.userid и req.session.user = req.body.userid, но проблема все еще существует, сеанс не является постоянным. - person Spiicyz; 15.04.2018
comment
Как упоминалось ранее, запрос возвращает массив, поэтому используйте req.session.user = data[0].userid ; - person AmirHossein Rd; 15.04.2018