【问题标题】:res.locals returned undefinedres.locals 返回未定义
【发布时间】:2014-01-14 13:11:12
【问题描述】:

我正在尝试设置一些 响应特定 变量,当我从中间件中记录它时,我得到了 undefinedres.locals,但它返回的函数很好如果我从路由函数中记录它。

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(function (res, req, next) {
  console.log("res.locals from app.use middleware: ", res.locals);
  // res.locals.boom = 'nice';
  // res.locals.zoom = 'yeah!';
  next();
});
app.use(app.router);
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

有什么想法吗?

【问题讨论】:

    标签: node.js express templating


    【解决方案1】:

    您的请求和响应对象是倒退的。显然,如果您知道代码中的差异,命名并不重要,但最好保持正确命名。

    app.use( function (request, response, next) {
        // stuff
    });
    

    我想不起来,但我相信你想要:

    request.app.locals;
    

    使用我上面的例子。同样,不是 100% 确定。您可以随时控制要检查的请求对象。

    【讨论】:

    • 双重检查,是的,request.app.locals 如果你想从你编写的中间件/模块中存储本地,以便 ejs 模板可以访问它们(或任何其他使用本地的系统)跨度>
    【解决方案2】:

    app.locals 对象是一个 JavaScript 函数,当与对象一起调用时会将属性合并到自身中,从而提供一种将现有对象公开为局部变量的简单方法。

    app.locals({
      title: 'My App',
      phone: '1-250-858-9990',
      email: 'me@myapp.com'
    });
    
    app.locals.title
    // => 'My App'
    
    app.locals.email
    // => 'me@myapp.com'
    

    【讨论】:

    • 我刚刚在 Node.js in Action 中读到了这一点,就像十秒前一样。不是我要问的,而是非常有趣的功能。我要试试看!
    • 你到底想知道什么?
    • 为什么我似乎无法设置 res.locals。
    • res.locals 仅在请求的生命周期内持续存在。 app.locals 在应用程序的生命周期内持续存在。 expressjs.com/api.html#app.locals
    猜你喜欢
    • 2020-07-31
    • 2022-01-05
    • 2019-11-17
    • 1970-01-01
    • 2016-11-18
    • 2019-12-24
    • 2016-05-15
    • 2017-03-11
    • 2019-07-09
    相关资源
    最近更新 更多