我在为某些路由设置某些中间件时碰到了这个问题。在我的应用程序中,我只需要在我的联系页面上使用session和csrf。
这是问题所在。当我在外部需要它们并使用数组中的引用作为路由参数时,它可以正常工作。会话工作正常,并期望每个请求和CSRF检查传递相同的cookie(sessionID)。
但是,当我使用函数返回“中间件”数组时,它的行为异常。当我'联系'时,我收到一个sessionID,当我'发布'时,显然会话重新开始,因为我有较旧的sessionID,所以我收到错误。奇怪的是,CSRF还期望另一个csrf令牌,而不是它发送给我的那个。
我知道这与我在模块中要求的方式有关,但是我希望能够清楚地解释为什么会发生这种情况。请注意我是初学者,所以对我很轻松:)谢谢!
// MIDDLEWARE FOR CERTAIN ROUTES
// This works fine!
var session = require('express-session')({secret: 'i lit fire to the rain', saveUninitialized: false, resave: true});
var csrf = require('csurf')();
router.get('/contact', [session, csrf], function(req, res, next) {
});
router.post('/contact', [session, csrf], function(req, res, next) {
});
// but this does not work
var contactMiddleware = function() {
var session = require('express-session')({secret: 'i lit fire to the rain', saveUninitialized: false, resave: true});
var csrf = require('csurf')();
return [session, csrf];
};
router.get('/contact', contactMiddleware(), function(req, res, next) {
});
router.post('/contact', contactMiddleware(), function(req, res, next) {
});
答案 0 :(得分:0)
嗨,你有没有试过这样做:
router.get('/contact', contactMiddleware, function(req, res, next)
编辑: 所以你只需要一个静态数组,所以为什么不这样做呢
var array = (function() {
var session = require('express-session')({secret: 'i lit fire to the rain', saveUninitialized: false, resave: true});
var csrf = require('csurf')();
return [session, csrf];
})();
然后将你的数组传递给路线?
router.get('/contact', array, function(req, res, next) {
res.send('contact');
});