javascript - 在 node.js (Express) 中分配给 res 和 res.locals 的区别

标签 javascript node.js express

您好,我有一些关于在 Express 中使用 res(Express 响应对象)和 res.locals 的新手问题。

在其中一个代码示例中学习nodejs时有一个中间件(messages.js),一个服务器(app.js)和模板(messages.ejs)。查看模板的示例代码。看来,虽然 messages 和 removeMessages() 被分配给 res.locals。您可以使用消息或 removeMessages() 访问它们,而无需在调用前加上本地人。我想知道以下内容:

  1. 它们是否指向相同的对象?
  2. 如果它们相同,我是否直接分配给 res 而不是 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(); %>
<% } %>

最佳答案

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>

关于javascript - 在 node.js (Express) 中分配给 res 和 res.locals 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24072333/

相关文章:

javascript - 在客户端编译和渲染复杂的 Dust.js 模板

javascript - 如何使用 adonisjs 在 Controller 中 foreach 循环数据

javascript - 如何在一个页面上放置多个canvas js动画。 (创建)

javascript - 在nodewebkit中使用lua.vm.js进行io操作

node.js - 将 HttpContext 注入(inject) InversifyJS 中间件

javascript - 谷歌地图标记位置不正确

javascript - 如何使用 NightmareJs 串行下载多个文件?

php - 将 NodeJS Realtime 与现有 PHP 应用程序集成

sql - 仅当项目属于所有者时才插入序列

node.js - ExpressJS 的 socket.io 设置