Express4。 app.locals,res.locals和req.app.locals之间有什么区别?
使用快递4时我很困惑。我使用快速生成器来生成我的项目。路由器文件中的root和index.js中有app.js。但是,关于快递的互联网教程正在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> | </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> | </span>
<li><a href="#" class="navbar-link" data-toggle="modal" data-target="#signupModal">注册</a>
</li>
<% } %>
回答如下:
app.locals
对象是一个JavaScript对象,其属性是应用程序中的局部变量。app.locals.title // => 'My App' app.locals.email // => '[email protected]'
设置后,app.locals
属性的值在应用程序的整个生命周期中都会持续存在- 与
res.locals
属性相反,res
属性仅在请求的生命周期内有效。当你处理你有app.locals
对象的路线时,你不会有一个app对象,反之亦然req.app.locals
。 - 您可以在应用程序中呈现的模板中访问局部变量。这对于为模板提供辅助函数以及应用程序级数据非常有用。当地人可以通过req.app获得中间件(参见
app.locals.title = 'My App'; app.locals.strftime = require('strftime'); app.locals.email = '[email protected]';
)Node.js In Action
来自app.local
的一张图片如下,描述了res.local
和的区别
express documentation