javascript - Express.js 查看 "globals"

标签 javascript node.js express

我正在使用 Express.js(在 Node.js 上),我知道您可以通过“locals”参数呈现带有自定义数据的 View 。 (res.render("template", { locals: { foo: "bar"} });)

有没有办法拥有“全局”? (即每个 View 都可以访问的数据)

我看到了 view options,但这不是递归的,所以如果我在模板中使用任何局部变量,它会替换我设置的局部变量。

这是我的用例:我想让它可以在每页的基础上添加 CSS/JS 文件,这是我主要布局的一部分。问题是,如果我没有在每次渲染时明确设置这些数组,我会得到一个未定义的错误,所以在我的模板中我总是必须做 typeof css !== "undefined" 舞蹈。此外,我还有其他选择框选项列表,我不想显式添加到我的每个表单中。

最佳答案

对于自 Express 3 发布以来可能遇到此问题的人来说,值得注意的是,“dynamicHelpers”方法不再存在。

相反,您可以使用 app.locals 函数,该函数充当您可以在其中存储值或函数的对象,然后将它们提供给 View 。例如:-

// In your app.js etc.
app.locals.title = "My App";
app.locals({
    version: 3,
    somefunction: function() {
        return "function result";
    }
});

// Then in your templates (shown here using a jade template)

=title
=version
=somefunction()  

// Will output

My App
3
function result

如果您需要访问请求对象以从中提取信息,您可以编写一个简单的中间件函数并使用 app.settings 变量。

例如,如果您使用 connect-flash 向您的用户提供消息,您可能会执行以下操作:

app.use(function(req, res, next) {
    app.set('error', req.flash('error'));
    next();
});

这将使您可以访问模板中带有 =settings.error 的错误消息。

这些主题在此处进行了介绍,尽管有些简短:http://expressjs.com/api.html#app.locals

更新:Express 4

app.locals 现在是一个简单的 JavaScript 对象,所以每个属性都必须一个一个地设置。

app.locals.version = 3;
app.locals.somefunction = function() {
    return "function result";
}

res.locals 提供完全相同的功能,除了它应该用于请求特定的数据而不是应用程序范围的数据。用户对象或设置是常见的用例。

res.locals.user = req.isAuthenticated() ? req.user : null;
res.locals.userSettings = {
    backgroundColor: 'fff'
}

关于javascript - Express.js 查看 "globals",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718818/

相关文章:

javascript - 使用jquery获取同一类下的相应div元素

node.js - Nodejs中stdin的结束进程

node.js - 连接 mongodb 中的两个集合

php - Javascript/jquery 在 IE8 中不工作

javascript - 使用 JavaScript 进行图像交换不起作用

javascript - 如何在用 JSON 中的 JS 填充的表中进行可操作的工作?

node.js - Heroku 上的 Clojurescript

javascript - Node.js 导出问题

javascript - 服务器端渲染的全局状态

javascript - 快速响应未在 Sequelize catch 处理程序中执行