当前位置: 首页 > 面试题库 >

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

尹善
2023-03-14
问题内容

嗨,我对Express中使用res(Express响应对象)和res.locals有一些新手问题。

在其中一个代码示例中研究nodejs时,有一个中间件(messages.js),一个服务器(app.js)和模板(messages.ejs)。查看模板的示例代码。看来尽管将message和removeMessages()分配给了res.locals。您可以使用message或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>


 类似资料:
  • 问题内容: 我刚刚阅读Express文档,发现了这两个术语,并且 我知道在节点中用于在路径上 安装中间件 ,并且我们经常在大多数节点应用中使用它。但是两者都一样吗?如果没有,有什么区别? 我在这里了解了路由器。我还在SO上找到类似的问题,“ express.Router”和使用“app.get”进行路由之间有什么区别?和app.all(’*’)和app.use(’/’)之间的区别,但它们并没有真正

  • 问题内容: node.js中的“ process.stdout.write”和“ console.log”之间有什么区别? 编辑:使用console.log的变量显示了很多不可读的字符,而使用process.stdout.write的显示了一个对象。 这是为什么? 问题答案: 带有格式化输出的调用。有关实现,请参见console.js。 当前(v0.10.ish):

  • 问题内容: res.setHeader和res.header有什么区别。应该使用哪一个启用CORS?在某些页面中,使用res.header,而在某些页面中将res.setHeader用于CORS。 问题答案: 是Node.js的本机方法,也是Express框架中方法的别名。 文档:, 这两种方法做的完全一样,设置标头的HTTP响应。唯一的区别是只允许您 设置单个标头 ,并允许您 设置多个标头 。因

  • 问题内容: 在python中,调用和分配给字典之间有区别吗?如果是,那是什么?例: 问题答案: 如果您还有另一个变量也引用相同的字典,则有很大的不同: 这是因为分配会创建一个新的空字典并将其分配给变量。这样就指向旧字典,里面还有项目。但是,清除相同的字典,并且两者都指向。

  • 问题内容: 在护照[配置身份验证]文档中,它具有看上去很吓人的功能,该功能使用了神秘功能“完成”。 现在,在快速文档中,有许多方法可以传递称为next的方法。 这是快递和护照这两个框架之间的区别吗?还是他们在做两件事? 问题答案: 这是快递和护照这两个框架之间的区别吗? 不,它们的用途不同。Express用作node.js上的应用程序框架,其中护照仅处理Web应用程序的身份验证部分。 关于next

  • 问题内容: 有人问过类似的问题,但我的问题是,如果我想传播通过不同路由中间件获得的中间结果,什么是最好的方法? 我认为我可以通过使用 req .locals 通过不同的中间件获得相同的数据传播。同样,请求和响应对象似乎都具有在请求开始时初始化为空对象的locals属性。 另外,也可以设置res.mydata或req.mydata属性吗? 从理论上讲,app.locals也可以用于通过不同的中间件传