2016-11-13 92 views
0

我碰到这个,同时设置一些中间件只为某些路线。在我的应用程序中,我只需要在联系页上使用会话和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

这与PHP有什么关系? –

+0

啊,这是一个错误:) – donnyjeremiah

回答

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

+0

我做了,但它的请求过去'挂起',所以我在函数结束时调用next()。我最终得到了一个404,而它只是没有成功。 – donnyjeremiah