2016-11-13 87 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