Node.js 使用快速会话未定义req.session

Node.js 使用快速会话未定义req.session,node.js,express,Node.js,Express,我刚刚开始学习如何将cookies与node和express一起使用,我希望得到一些帮助,以使其正常工作。我试图按照GitHub上的教程进行操作,但是我得到了req.session作为undefined,因此我无法设置或获取任何值 我的目标是将用户的名字和姓氏保存到cookie中,以便自动填充输入字段。我不确定我是否也需要使用cookie解析器,或者express会话是否可以单独处理。我不知道如何继续,因为我是新的饼干和快速会话 感谢您的帮助!提前谢谢 代码 let express = requ

我刚刚开始学习如何将cookies与node和express一起使用,我希望得到一些帮助,以使其正常工作。我试图按照GitHub上的教程进行操作,但是我得到了
req.session
作为
undefined
,因此我无法设置或获取任何值

我的目标是将用户的名字和姓氏保存到cookie中,以便自动填充输入字段。我不确定我是否也需要使用
cookie解析器
,或者
express会话
是否可以单独处理。我不知道如何继续,因为我是新的饼干和快速会话

感谢您的帮助!提前谢谢

代码

let express = require('express');
let app = express();
let credentials = require('../modules/credentials.js');
let session = require('express-session');
let sessionOptions = {
  secret: credentials.cookieSecret,
  cookie: {
    maxAge:269999999999
  },
  saveUninitialized: true,
  resave:true
};

if (app.get('env') === 'production') {
  app.set('trust proxy', 1);
  sessionOptions.cookie.secure = true;
}
else {
  sessionOptions.cookie.secure = false;
}

app.use(session(sessionOptions));
let router = express.Router();
app.use(router);

let request = require('request');
let db = require('../modules/queries');
let bodyParser = require('body-parser');
let cookieParser = require('cookie-parser');


// app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

router.get('/me', function(req, res, next) {
  console.log('req.session: '+req.session);

  let firstName = req.session.firstName;
  let lastName = req.session.lastName;
  if (firstName && lastName) {
    res.render('student/me.jade', {firstName, lastName});
  }
  else {
    res.render('student/me.jade', { firstName: '', lastName: ''});
  }
});

router.post('/api/me', function(req, res, next) {
  let firstName = req.body.firstName;
  let lastName = req.body.lastName;
  // session.firstName = firstName;
  // session.lastName = lastName;
  req.session.firstName = firstName;
  req.session.lastName = lastName;
  console.log('session.firstName: '+session.firstName);
  db.addEvent(req, res, next);
});

module.exports = router;
获取会话数据的步骤

首先,您必须使用初始化express会话

app.use(session({ resave: true ,secret: '123456' , saveUninitialized: true}));
然后,当您想在会话中添加内容时

req.session.firstName = 'Aniruddha';
req.session.lastName = 'Chakraborty';
然后你可以检查没有错误

console.log('req.session: '+req.session.firstName);
注意:这是快速会话工作


一旦您将路由器装载到Express应用程序上,该应用程序上任何随后声明的中间件都不会被调用以路由器为目标的任何请求

所以如果你有这个:

app.use(router)
app.use(session(...));
对于由
路由器
处理的任何请求,会话中间件都不会被调用(即使您声明了路由器稍后应该处理的路由)。为此,您需要更改顺序:

app.use(session(...));
app.use(router);
另一个问题是您正在导出
路由器
,它可能应该是
应用程序
(它是“保存”所有中间件、路由器等的实例):


我在尝试维护应用程序中的
req.session
对象时出现此问题。我在登录路径中设置了
req.session.user
,但在该路径之外无法获得相同的设置

console.log(req.session) 
// undefined
因为我的应用程序中没有使用
cookie
,所以我删除了它

删除cookie变量之前:

删除cookie变量后:

这解决了我的问题。现在我可以从应用程序的任何地方访问
req.session

console.log(req.session)
/* Session{
     ......
     ......
    }
*/
注意:如果您初始化了
app.use(session({…}))
文件底部,也可能会出现此问题。试着把它带到顶端


发生这种情况的原因:

如果您的Redis连接无效或丢失,您还将看到
req.session===undefined


在配置会话时,我看不到您的代码中有传递连接信息的地方。

谢谢@robertklep-我做了切换。这并没有解决问题,但了解未来会有帮助@RonI
req.session
未定义表示会话中间件未被调用(否则,它将使用空对象填充
req.session
)。你能展示(在你的问题中)你是如何将路由/中间件添加到你的应用程序中的吗?@RonI你是使用
express generator
创建项目的吗?@RonI查看我关于导出
app
而不是
router
的编辑。很好!我没有看到“关于导出的编辑”应用程序,我做了更改,现在可以使用了!谢谢:)
app.use(
session({
    resave: false,
    saveUninitialized: true,
    secret: "anyrandomstring",
    cookie: { secure: true},
  })
);
app.use(
session({
    resave: false,
    saveUninitialized: true,
    secret: "anyrandomstring",
  })
);
console.log(req.session)
/* Session{
     ......
     ......
    }
*/