Разница между назначением 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>