Javascript 快递4。什么';app.locals、res.locals和req.app.locals之间的区别是什么?

Javascript 快递4。什么';app.locals、res.locals和req.app.locals之间的区别是什么?,javascript,node.js,express,Javascript,Node.js,Express,我在使用express 4时感到很困惑。我使用express generator生成我的项目。根目录中有app.js,路由器文件中有index.js。然而,互联网上关于express的教程直接在app.js中使用路由器。因此,当我想在index.js(路由器文件中)中设置一些变量时,我使用app.locals,但它不起作用。但是当我换成另外两个时,我的ejs模板就可以工作了。。。我很困惑。谁能告诉我它们之间的区别以及如何正确使用 <!-- language: index.js in rou

我在使用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>
      <% } %>

var app=需要('express');
var router=express.router();
....
router.get('/',函数(req,res,next){
var_user=req.session.user;
如果(_用户){
//没用!!
//app.locals.user=\u user;
//我不确定下面哪个用法是正确的
//1.
req.app.locals.user=\u user;
//2.
//res.locals.user=\u user;
}
}
  • |
    • 该对象是一个JavaScript对象,其属性是应用程序中的局部变量

      app.locals.title
      // => 'My App' 
      app.locals.email
      // => 'me@myapp.com'
      
      设置后,
      app.locals
      属性的值将在应用程序的整个生命周期内保持不变

    • 与仅在请求生存期内有效的
      res.locals
      属性相反,当您处理包含
      res
      对象的路由时,您不会在其中包含app对象,反之亦然

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

    下面是
    Node.js In Action
    书中的一张图片,描述了
    app.local
    res.local

    来自

    简而言之

    app.locals

    app.locals
    对象是一个JavaScript对象,其属性是应用程序中的局部变量

    app.locals.title
    // => 'My App' 
    app.locals.email
    // => 'me@myapp.com'
    
    这意味着您可以使用
    locals
    app.js
    中声明一个变量,并在该脚本中访问该变量或将其传递给
    响应对象

    res.locals

    有了它,您可以设置变量或将变量发送到客户端html/view,并且它仅在该视图/html中可用

    e、 g

    这里,
    用户
    变量可在请求
    视图
    路由的html页面中使用

    请求本地应用程序


    通过
    req.app.Locals

    在中间件中可以使用局部变量,非常感谢!我现在有了更好的理解
    app.get('/view', function(req, res) {
      res.locals.user = req.user;
    });