在node.js(Express)中分配给res和res.locals的区别
您好,我有一些关于在Express中使用res(快速响应对象)和res.locals的新手问题。
在其中一个代码示例中学习nodejs时有一个中间件(messages.js),一个服务器(app.js)和模板(messages.ejs)。 查看模板的示例代码。 看起来虽然message和removeMessages()被分配给了res.locals。 您可以使用消息或removeMessages()来访问它们,而不用在本地调用前缀。 我想知道以下几点:
- 他们是否指向相同的对象?
- 如果他们是一样的,这是否有关系,而不是res.locals直接分配给res?
示例代码
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
)的对象。 他们在渲染中将是“全局的”,所以你不需要在它们上面添加任何东西来使用它们。
假设我们希望我们的服务器在生产模式下从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>
- NodeJS请求:如何获得响应作为一个string?
- Node.js:什么是我们在asynchronous编程中回复正确请求的保证?
- 将httpredirect到https express.js
- 如何在Express 4.0路由器中间件中重用MongoClient对象?
- express-validator / node-validator:如何validation该属性是否存在,并且应该存在
- Socket.io,https,并表示连续的连接/断开循环
- expressjs req.body.username未定义
- Nodejs / Express – '标题'不能渲染
- Node.js中Express 4.0的res.rendercallback参数的目的是什么?