在node.js(Express)中分配res和res.locals之间的区别

see*_*etd 21 javascript node.js express

嗨,我有一些关于在Express中使用res(Express响应对象)和res.locals的新手问题.

在其中一个代码示例中研究nodejs时有一个中间件(messages.js),一个服务器(app.js)和模板(messages.ejs).查看模板的示例代码.看来虽然message和removeMessages()被分配给res.locals.您可以使用消息或removeMessages()访问它们,而无需使用locals作为前缀.我想知道以下内容:

  1. 他们指向相同的对象吗?
  2. 如果我们分配res直接而不是res.locals它们是相同的吗?

示例代码

messages.js

var express = require('express');
var res = express.response;
res.message = function (msg, type) {
    type = type || 'info'
    var sess = this.req.session;
    sess.messages = sess.messages || [];
    sess.messages.push({
        type: type,
        string: msg
    });
};
res.error = function (msg) {
    return this.message(msg, 'error');
};
module.exports = function (req, res, next) {
    res.locals.messages = req.session.messages || [];
    res.locals.removeMessages = function () {
        req.session.messages = [];
    };
    next();
};
Run Code Online (Sandbox Code Playgroud)

app.js(部分代码)

var express = require('express');
var messages = require('./lib/messages');
var app = express();
app.use(messages);
Run Code Online (Sandbox Code Playgroud)

messages.ejs

<% if(locals.messages) { %>
    <% messages.forEach(function (message) { % %>
        <p class = '<%= message.type %>' > <%= message.string %> < /p>
    <% }) %>
    <% removeMessages(); %>
<% } %>
Run Code Online (Sandbox Code Playgroud)

Som*_*ens 31

res.locals是传递给您的应用正在使用的任何渲染引擎的对象(在本例中ejs).它们在渲染中将是"全局的",因此您无需在它们之前添加任何内容即可使用它们.

假设我们希望我们的服务器在生产模式下从S3获取JavaScript,但在开发时使用本地副本. res.locals让这很容易.我们在app.js中有这些行的中间件:

if ('production' === app.get('env')) {
  res.locals.jsLocation = 'https://s3.amazonaws.com/kittens/js/'
} else {
  res.locals.jsLocation = '/js/';
}
Run Code Online (Sandbox Code Playgroud)

并且index.ejs会是这样的:

<script src="<%= jsLocation %>angular.min.js"></script>
<script src="<%= jsLocation %>myAngularFile.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 所以这意味着如果我要做下面列出的代码.res.locals.messages在ejs中公开,而res.nonLocalmessages不能访问,也无法访问.`module.exports = function(req,res,next){res.locals.messages = req.session.messages || []; res.nonLocalmessages = req.session.messages || []; 下一个(); };` (2认同)
  • @ user3247380你是对的.你可以在ejs中引用它作为`messages` (2认同)