嗨,我对Express中使用res(Express响应对象)和res.locals有一些新手问题。
在其中一个代码示例中研究nodejs时,有一个中间件(messages.js),一个服务器(app.js)和模板(messages.ejs)。查看模板的示例代码。看来尽管将message和removeMessages()分配给了res.locals。您可以使用message或removeMessages()来访问它们,而无需在呼叫之前加上本地语言。我想知道以下几点:
样例代码
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(); %> <% } %>
res.locals是传递给您的应用程序正在使用的呈现引擎的对象(在本例中为ejs)。它们在渲染中将是“全局”的,因此您无需在它们之前添加任何内容即可使用它们。
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会是这样的:
index.ejs
<script src="<%= jsLocation %>angular.min.js"></script> <script src="<%= jsLocation %>myAngularFile.js"></script>