req.session 是未定义的快速会话
req.session is undefined express-session
我知道这个问题已经被问过好几次了。然而,none 我读过的答案解决了我的问题。
其中许多对于 express v4 已经过时,因为 express-session 目前是一个单独的模块。 question/answers 在这里:
- 'session' is undefined when using express / redis for session store
- req.session undefined in Express.js
- nodejs express req.session undefined
其他问题已更新,但是给出的解决方案并没有解决我的问题。 question/answers 在这里:
- NodeJS express-session req.session is undefined
大多数解决方案都是配置应用程序时的中间件顺序。我尝试了不同的选择,但没有找到正确的方法。也许就是这样。
在其他解决方案中,有人说无法调用 session
中间件,因为如果调用,则会定义 req.session
。我在 app.use(session({...}))
之前和之后使用了中间件,并检查了两者是否都被调用了。
我还在 this issue 中发现有人说当商店断开连接时他得到 req.session
undefined。到目前为止,我使用的是默认商店。这可能是问题所在吗?
我收到这个错误:
TypeError: Cannot read property 'destroy' of undefined
当我尝试在 login.js 注销与 req.session.destroy()
的会话时它中断了(见下面的代码)
我的代码
server.js
const express = require('express');
const session = require('express-session');
const mongo = require('mongodb');
const passport = require('passport');
const path = require('path');
const routes = require('./app/routes');
const login = require('./app/routes/login.js');
const app = express();
app.use(session({
secret: 'key',
resave: false,
saveUninitialized: true,
}));
app.use(passport.initialize());
app.use(passport.session());
app.use('/public', express.static(path.normalize('./public')));
app.use(routes);
app.use(login);
app.set('view engine', 'pug');
const MongoClient = mongo.MongoClient;
MongoClient.connect('mongodb://localhost:27017/myapp')
.then((db) => {
// Link the database through the app. It will be available in the req.app object
app.db = db;
console.log('App listening on port ' + process.env.PORT);
app.listen(process.env.PORT);
})
.catch((err) => {
console.log('There was an error connecting to the database.');
console.log(err);
});
module.exports = app; // For testing
login.js
const express = require('express');
const passport = require('passport');
const router = new express.Router();
// Other login logic here
router.get('/logout', (res, req) => {
req.session.destroy((err) => {
req.redirect('/');
});
});
module.exports = router;
您在处理程序中交换了 req
和 res
参数:
router.get('/logout', (res, req) => { ... })
应该反过来:
router.get('/logout', (req, res) => { ... })
我知道这个问题已经被问过好几次了。然而,none 我读过的答案解决了我的问题。
其中许多对于 express v4 已经过时,因为 express-session 目前是一个单独的模块。 question/answers 在这里:
- 'session' is undefined when using express / redis for session store
- req.session undefined in Express.js
- nodejs express req.session undefined
其他问题已更新,但是给出的解决方案并没有解决我的问题。 question/answers 在这里:
- NodeJS express-session req.session is undefined
大多数解决方案都是配置应用程序时的中间件顺序。我尝试了不同的选择,但没有找到正确的方法。也许就是这样。
在其他解决方案中,有人说无法调用 session
中间件,因为如果调用,则会定义 req.session
。我在 app.use(session({...}))
之前和之后使用了中间件,并检查了两者是否都被调用了。
我还在 this issue 中发现有人说当商店断开连接时他得到 req.session
undefined。到目前为止,我使用的是默认商店。这可能是问题所在吗?
我收到这个错误:
TypeError: Cannot read property 'destroy' of undefined
当我尝试在 login.js 注销与 req.session.destroy()
的会话时它中断了(见下面的代码)
我的代码
server.js
const express = require('express');
const session = require('express-session');
const mongo = require('mongodb');
const passport = require('passport');
const path = require('path');
const routes = require('./app/routes');
const login = require('./app/routes/login.js');
const app = express();
app.use(session({
secret: 'key',
resave: false,
saveUninitialized: true,
}));
app.use(passport.initialize());
app.use(passport.session());
app.use('/public', express.static(path.normalize('./public')));
app.use(routes);
app.use(login);
app.set('view engine', 'pug');
const MongoClient = mongo.MongoClient;
MongoClient.connect('mongodb://localhost:27017/myapp')
.then((db) => {
// Link the database through the app. It will be available in the req.app object
app.db = db;
console.log('App listening on port ' + process.env.PORT);
app.listen(process.env.PORT);
})
.catch((err) => {
console.log('There was an error connecting to the database.');
console.log(err);
});
module.exports = app; // For testing
login.js
const express = require('express');
const passport = require('passport');
const router = new express.Router();
// Other login logic here
router.get('/logout', (res, req) => {
req.session.destroy((err) => {
req.redirect('/');
});
});
module.exports = router;
您在处理程序中交换了 req
和 res
参数:
router.get('/logout', (res, req) => { ... })
应该反过来:
router.get('/logout', (req, res) => { ... })