要求函数调用的方法不起作用

时间:2016-11-13 18:53:27

标签: node.js session express csrf middleware

我在为某些路由设置某些中间件时碰到了这个问题。在我的应用程序中,我只需要在我的联系页面上使用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) {
});

1 个答案:

答案 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'); });