有条件的app.use在节点 – expression

有没有可能在app.js中有条件地使用app.use ? 表示cookie会话 不能dynamic地改变maxAge的值,我正在考虑做这样的事情,但我得到一些错误:

 app.use(function(req,res,next ){ if(typeof req.session == 'undefined' || req.session.staySignedIn === 'undefined'){ //removing cookie at the end of the session cookieSession({ httpOnly: true, secure: false, secureProxy: true, keys: ['key1', 'key2'] }); }else{ //removing cookie after 30 days cookieSession({ maxAge: 30*24*60*60*1000, //30 days httpOnly: true, secure: false, secureProxy: true, keys: ['key1', 'key2'] }); } next(); }); 

而不是正常使用它:

 app.use(cookieSession({ httpOnly: true, secure: false, secureProxy: true, keys: ['key1', 'key2'] })); 

现在我收到以下错误:

无法读取未定义的属性“用户”

我相信这是指这条线(虽然没有说明确切的地方)

 req.session.user; 

Express中的中间件是一个函数,如function (req, res, next) {} 。 在你的例子中, cookieSession(options)将返回这样一个函数,但是在你的中间件中你不会运行这个函数,你忽略了cookieSession的返回值 – 也就是你想运行的中间件。 然后你运行next()

你想要做的就是执行你的实际中间件,我们称之为条件中间件。 像这样的东西:

 app.use(function (req, res, next) { var options = { httpOnly: true, secure: false, secureProxy: true, keys: ['key1', 'key2'] }; if(typeof req.session == 'undefined' || req.session.staySignedIn === 'undefined') { options.maxAge = 30*24*60*60*1000; // 30 days } return cookieSession(options)(req, res, next); }); 

你可以使用这个插件快速条件树中间件 。

它允许你组合多个asynchronous中间件。 一探究竟! 您可以创build两个类(一个用于您的第一个案例,一个用于您的第二个案例),分别在applyMiddleware函数中编写代码,然后将这些类导入到主JavaScript文件中,然后使用orChainer将它们合并。 查看文档了解更多信息!