Express Session与特定路线不同

这是我的快递服务器代码:

// app.js const express = require('express'); const app = express(); const logger = require('morgan'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const session = require('express-session'); app.use(logger('[:date[iso]] :method :url :status :response-time ms - :res[content-length]')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(session({ secret: '...', resave: false, saveUninitialized: false, maxAge: 1000 * 60 * 60 // 1 hour })); // Routes go from here app.use('/', require(__dirname + '/routes')); // catch 404 and forward to error handler app.use((req, res, next) => { var err = new Error('Not Found'); err.status = 404; next(err); }); 

这是路线部分:

 const express = require('express'); const router = express.Router(); router.use('/accounts', require('./accounts')); router.use('/keys', require('./keys')); module.exports = router; 

而在/帐户和/密钥路线,我打印会议是这样的:

 const express = require('express'); const router = express.Router(); // Print session from here router.use(function(req, res, next) { console.log(req.session); next(); }); router.get(...); router.post(...); 

会话是这样创build的:

 /** * Sign In */ router.post('/', (req, res, next) => { co(function*() { try { const { email, password } = req.body; yield auth.check(email, password); // Check email and password correct // get user data from Users table const getUsers = yield users.get({ email: email }); const user = getUsers[0]; // And get first matched data // combine user data into new object to save into session const userInfo = { id: user.id, email: email, status: user.status, createdAt: user.createdAt, updatedAt: user.updatedAt }; yield new Promise((resolve, reject) => { req.session.regenerate((err) => { if(err) { return reject(err); } req.session.userInfo = userInfo; req.session.save((err) => { if(err) { return reject(err); } resolve(); }); }); }); res.json(userInfo); } catch(err) { return next({ status: getStatusCode(err), message: err.message, stack: err.stack || {} }); } }); }); 

在/帐户中,打印结果:

 Session { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }, userInfo: { id: 1, email: 'test', status: 'inactive', createdAt: '2016-12-05T11:21:59.000Z', updatedAt: '2016-12-05T11:21:59.000Z'} 

但在/键,它有不同的会议:

 Session { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true } } 

正如你所看到的,在/键路由会话刚刚重置。 我多次讨厌这个请求,但仍然有同样的结果。

我没有在/ accounts和/ key路由中做任何会话相关的工作。 但为什么只有/键路线有不同的会议?

当你看到我的代码,我实际上我的自定义路由行为之前打印会话,路由文件的顶部,所以没有办法操纵会话。

为什么发生这种情况? 使用Express@4.15.4和express-session@1.15.5。 任何build议将非常感激!

补充:我弄清楚什么时候发生,但是还是不明白为什么会发生这种情况。

只有当我从router.use需要相同的中间件时才会发生这种情况,而不是在router.get中:

 // Router that I used: function checkUserAuth(req, res, next) { if(req.session.userInfo) { return next(); } next({ status: 401, message: 'Unauthorized Request', stack: {} }); } // In /accounts router.get('/', checkUserAuth, (req, res, next) => { ... }); // In /keys router.use(checkUserAuth); router.get('/', (req, res, next) => { ... }); 

据我所知,两种方式都是一样的。 但只有当我使用router.use使用中间件时才会发生。

所以,当我删除router.use,并把中间件作为router.get的参数,现在它的工作。

我不想把每个路线都放在中间件上。 为什么发生这种情况?