【问题标题】:req.session is undefined nodeJSreq.session 是未定义的nodeJS
【发布时间】:2019-04-12 11:47:39
【问题描述】:

我试图在 NodeJS 中建立一个会话,然后在我的 /auth 路由中使用它,但我在会话中遇到了未定义的问题。

在 app.js 中:

const express = require('express'),
  path = require('path'),
  bodyParser = require('body-parser'),
  cors = require('cors'),
  mongoose = require('mongoose'),
  config = require('./config/DB');

const app = express();
  const session = require('express-session')
  const MongoStore = require('connect-mongo')(session);

mongoose.connect(config.DB, { useNewUrlParser: true }).then(
  () => { console.log('Database is connected') },
  err => { console.log('Can not connect to the database' + err) },
  options
);
const db = mongoose.connection


const adUnitRoutes = require('./routes/adunit.route');
const userProfileRoutes = require('./routes/userprofile.route');


app.use('/adunits', adUnitRoutes);
app.use('/userprofile', userProfileRoutes);

app.use(session({
  secret: 'my-secret',
  resave: false,
  saveUninitialized: true,
  store: new MongoStore({ mongooseConnection: db })
}));

在路线中:

userProfileRoutes.route('/authentification').post((req, res) => {

  console.log('req session : ' + req.session.userId);
//here I got cant read property of userId because session is undefined

});

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    这是因为您在添加中间件之前设置了路由。您的处理程序本质上是中间件,因此如果在 session 之前添加它们,则您的会话尚未被处理并添加到请求中。

    在设置中间件后添加路由将使其按预期工作。

    查看这个最小化的例子:

    const express = require('express');
    const app = express();
    const session = require('express-session');
    
    app.get('/broken', (req, res) => {
      console.log('req session : ' + req.session.userId);
      res.write(String(req.session.userId));
      req.session.userId = 1;
      res.end();
    });
    
    app.use(
      session({
        secret: 'my-secret',
        resave: false,
        saveUninitialized: true
      })
    );
    
    app.get('/ok', (req, res) => {
      console.log('req session : ' + req.session.userId);
      res.write(String(req.session.userId));
      req.session.userId = 1;
      res.end();
    });
    
    app.listen(8089);
    

    【讨论】:

    • 似乎合乎逻辑,但我错过了。我会记住的,谢谢。但是在重构并将会话放置在路由之前之后,在我的 ('/auth').post 路由之后,我仍然收到 req.session.userId 的未定义语句。还有其他建议吗?
    • 你的意思是req.session.userIdundefined 还是req.sessionundefined?在您在会话中设置值 (req.session.userId = 1;) 之前,前者才有意义,后者意味着错误在于您的代码和我的最小示例之间的差异。
    • 是的,我的错,我想我错过了一件事。我们是否必须手动为 req.session.userId 赋值?我认为默认值的分配是自动的。感谢您的帮助
    • 是的,您可以控制 req.session 中所有内容的值(您的 userId 是特定于您的服务的应用程序逻辑)。很高兴听到它有帮助!
    • 我只是对一些事情感到困惑,也许你可以帮助我(再次:P)。在 auth 之后的页面上,我的 userId 被很好地定义为我想要的 Session { cookie: ... } , {userId : idFromDB}。但是在导航之后,这个 userId 消失了,Session 现在就像没有变量 userID 的 Session {cookie : ...}。会话是否应该通过所有页面将变量保存在内存中,以便我可以在应用程序的任何位置使用它?提前致谢
    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2017-08-02
    • 2015-10-15
    • 2012-09-24
    • 2016-09-28
    • 2016-06-16
    相关资源
    最近更新 更多