节点中的条件app.use - express

时间:2016-01-07 12:08:08

标签: javascript node.js express cookie-session

是否可以在app.js中有条件地使用app.use? 快递cookie-session可以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']
}));

现在我收到以下错误:

  

无法读取未定义

的属性'user'

我认为这是指这一行(虽然它没有说明确切的地方)

req.session.user;

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您可以使用此插件Express Conditional Tree Middleware

它允许您组合多个和异步中间件。看看这个!您可以创建两个类(一个用于第一种情况,一个用于第二种情况),分别在applyMiddleware函数内编写代码,然后在主javascript文件中导入这些类,并使用orChainer进行组合。有关详细信息,请参阅文档!