Express4. app.locals、res.locals和req.app.locals有什么区别?

15
我在使用express 4时感到非常困惑。我使用express-generator生成了我的项目。根目录下有一个app.js文件,路由文件夹中有一个index.js文件。然而,互联网上关于express的教程都是直接在app.js中使用路由。因此,当我想在index.js(在路由文件夹中)中设置一些变量时,我使用了app.locals,但它不起作用。但当我改为另外两个选项时,我的ejs模板就正常工作了。我很困惑。请问有人能告诉我它们之间的区别以及如何正确使用吗?
<!-- language: index.js in router file -->

    var app = require('express');
    var router = express.Router();

    ....

router.get('/', function(req, res, next) {
    var _user = req.session.user;
    if (_user) {
      //does't work!!
      //app.locals.user=_user;
      //I am not sure about which usage is correct below
      //1.
      req.app.locals.user = _user;
      //2.
      // res.locals.user=_user;
    }
}

<!-- language: lang-ejs -->

    <% if (user) { %>
      <li><a class="navbar-link">Welcome <%= user.name %></a>
      </li>
      <span>&nbsp;|&nbsp;</span>
      <li><a href="/logout" class="navbar-link" id="logoutBtn">Logout</a>
      </li>
      <% } else { %>
        <li><a href="#" class="navbar-link" data-toggle="modal" data-target="#signinModal">登录</a>
        </li>
        <span>&nbsp;|&nbsp;</span>
        <li><a href="#" class="navbar-link" data-toggle="modal" data-target="#signupModal">注册</a>
        </li>
      <% } %>
2个回答

40
  • app.locals 对象是一个 JavaScript 对象,其属性是应用程序内的本地变量。

app.locals.title
// => 'My App' 
app.locals.email
// => 'me@myapp.com'

app.locals 属性一旦被设置,其值将在应用程序的整个生命周期内持续存在。

  • 与仅在请求期间有效的res.locals属性相比,两者有所不同。当您处理具有res对象的路由时,您不会在那里拥有app对象,反之亦然,对于app.locals也是如此。

  • 您可以在应用程序中呈现的模板中访问本地变量。这对于为模板提供辅助函数以及应用程序级数据非常有用。可以通过req.app.locals在中间件中使用locals(请参见req.app)。

  • app.locals.title = 'My App';
    app.locals.strftime = require('strftime');
    app.locals.email = 'me@myapp.com';
    

    以下是一张来自《Node.js实战》一书的图片,描述了app.localres.local之间的区别。

    enter image description here


    1
    非常感谢!我现在对此有了更好的理解。 - lwd931227
    你能解释一下使用app.locals的优点吗?我有点困惑,不知道是否应该使用它。 - Rupak

    12

    来自express文档

    简而言之,app.locals是一个JavaScript对象,它的属性是应用程序中的本地变量。

    这意味着您可以在app.js中使用locals声明一个变量,并在该脚本中访问它或将其传递给响应对象

    res.locals可以在客户端HTML/视图中设置或发送变量,并且仅在该视图/HTML中可用。

    例如:

    app.get('/view', function(req, res) {
      res.locals.user = req.user;
    });
    

    在请求view路由的html页面中,user变量可用。

    req.app.locals

    通过req.app.locals,中间件中可用的本地变量;


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接