Разница между назначением res и res.locals в node.js(Express)

Привет, у меня есть некоторые вопросы о том, как использовать res (Express response object) и res.locals в Express.

При изучении nodejs в одном из примеров кода Существует промежуточное программное обеспечение (messages.js), сервер (app.js) и шаблон (messages.ejs). Взгляните на образец кода для шаблона. Похоже, что сообщения и removeMessages() присваиваются res.locals. Вы можете получить к ним доступ с помощью сообщений или removeMessages() без префикса вызова с помощью локальных пользователей. Я хочу знать следующее:

  • Указывают ли они на одни и те же объекты?
  • Если они одинаковы, имеет значение, если я назначаю res direct вместо 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();
};

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

res.locals - это объект, переданный любому движку рендеринга, используемому вашим приложением (в данном случае ejs). Они будут "глобальными" в рендере, поэтому вам не нужно ничего добавлять к ним, чтобы использовать их.

Предположим, что мы хотели, чтобы наш сервер забирал наш JavaScript из S3 в режиме производства, но используем локальные копии при разработке. 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>