19

将 Express.js 从第 2 版更新到第 3 版,并且由于app.dynamicHelpers({..})在 V3 中不再存在以下对中断的调用:

app.dynamicHelpers({

    request: function(req){
      return req
    },
    ...etc.
});

有一个迁移指南是这样说的:

  • app.dynamicHelpers()(使用中间件 + res.locals)

但我很难过如何做到这一点。有没有更具体的例子来说明如何迁移它?

相关SO帖子: nodejs express 3.0

4

4 回答 4

28

我对session.user有同样的问题,只是通过理解 app.use 函数需要在配置部分而不是以前的位置来修复

前:

app.configure();
app.dynamicHelpers({
  user: function(req, res) {
    return req.session.user;
  }
});

后:

app.configure(function(){
  //...
  app.use(function(req, res, next){
    res.locals.user = req.session.user;
    next();
  });
  //...
});

对于 Flash 看看connect-flash

于 2012-07-26T20:02:51.163 回答
6

16 票的解决方案是正确的,但请务必在参考这篇文章res.locals之前使用分配 https://stackoverflow.com/a/12597730/1132109app.use(app.router);

于 2013-06-19T19:14:32.190 回答
3

查看 github 上的示例文件夹。例如身份验证

app.use(function(req, res, next){
  var err = req.session.error,
      msg = req.session.success;
  delete req.session.error;
  delete req.session.success;
  res.locals.message = '';
  if (err) res.locals.message = '<p class="msg error">' + err + '</p>';
  if (msg) res.locals.message = '<p class="msg success">' + msg + '</p>';
  next();
});

然后,您可以在模板中使用变量“消息”。

于 2012-07-20T15:59:53.307 回答
3

reponse.locals.use 是 Express 的一项新的有用功能,可让您将变量发送到首先需要评估的模型。例如,假设您想将 3 个变量发送到您的视图,所有这些变量都必须在对 mongodb 的请求之后。“旧”方法是嵌套 3 个回调,当最后一个回调返回时,您将呈现您的视图。locals.use 让这变得容易多了,因为它会评估你的函数,并且只有在所有函数都被评估后才会呈现你的视图。

这是有关如何使用它们的一小段代码(这是咖啡脚本,希望您可以将其转换为 javascript :D)

response.locals.use (request, response, done) ->
    myAsynchMethod (value) ->
        reponse.locals.myProperty = value
        done()

在这种情况下,将有一个名为 myProperty 的变量,您可以在视图上使用它的值设置为 myAsynchMethod 给回调的任何值。

于 2012-07-20T17:03:18.210 回答