节点中的条件 app.use - 表达

Conditional app.use in node - express

是否可以在app.js中有条件地使用app.use? 表达 cookie-session can not change the value of maxAge dynamically 我正在考虑做这样的事情,但我遇到了一些错误:

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

现在我收到以下错误:

Cannot read property 'user' of undefined

我相信它指的是这一行(虽然它没有说具体在哪里)

req.session.user;

Express中的一个中间件是function (req, res, next) {}这样的函数。在您的示例中,cookieSession(options) 将 return 这样的功能,但在您的中间件中您不会 运行 那个,您忽略 return 值 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);
});

你可以使用这个插件Express Conditional Tree Middleware

它允许您组合多个异步中间件。看看这个!您可以创建两个 类(一个用于您的第一个案例,一个用于您的第二个案例),分别在 applyMiddleware 函数中编写您的代码,然后将这些 类 导入您的主 [=16] =] 文件并使用 orChainer 组合它们。有关详细信息,请参阅文档!