一尘不染

Express.js查看“ globals”

node.js

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

有什么办法可以拥有“全局变量”吗?(即每个视图均可访问的数据)

我看到了view options,但这不是递归的,因此,如果我在模板中使用任何本地语言,它将替换我设置的本地语言。

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


阅读 249

收藏
2020-07-07

共1个答案

一尘不染

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

相反,您可以使用app.locals函数,该函数充当可以存储值或函数的对象,然后使它们可用于视图。例如:-

// 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'
}
2020-07-07