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

时间:2014-06-06 00:24:10

标签: 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,那么它们是否相同?
  3. 示例代码

    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();
    };
    

    app.js(部分代码)

    var express = require('express');
    var messages = require('./lib/messages');
    var app = express();
    app.use(messages);
    

    messages.ejs

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

1 个答案:

答案 0 :(得分:29)

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/';
}

index.ejs将是这样的:

<script src="<%= jsLocation %>angular.min.js"></script>
<script src="<%= jsLocation %>myAngularFile.js"></script>