2

是否可以有条件地app.use在 app.js 中使用?Express cookie-session不能动态更改值,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;
4

2 回答 2

4

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);
});
于 2016-01-07T12:18:13.223 回答
0

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

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

于 2017-07-24T08:21:08.507 回答