一尘不染

如何使用Express / Node.JS创建可在所有视图中访问的全局变量?

node.js

好的,所以我使用Jekyll建立了一个博客,您可以在文件中定义变量_config.yml,所有模板/布局均可访问该变量。我目前正在使用带有EJS模板和ejs-
locals的
Node.JS
/ Express(用于局部 /布局。我正在寻找与全局变量类似的方法,如果有人熟悉Jekyll
,就会发现这些变量。我有像网站的标题(而不是页面标题),作者/公司名称,在我所有页面上都保持不变。site.title``_config.yml

这是我目前正在做的一个例子:

exports.index = function(req, res){
    res.render('index', { 
        siteTitle: 'My Website Title',
        pageTitle: 'The Root Splash Page',
        author: 'Cory Gross',
        description: 'My app description',
        indexSpecificData: someData
    });
};

exports.home = function (req, res) {
    res.render('home', {
        siteTitle: 'My Website Title',
        pageTitle: 'The Home Page',
        author: 'Cory Gross',
        description: 'My app description',
        homeSpecificData: someOtherData
    });
};

我希望能够在一个地方定义诸如网站标题,描述,作者等之类的变量,并通过EJS在我的布局/模板中对其进行访问,而不必将它们作为对每个调用的选项进行传递res.render。有没有办法做到这一点,并且仍然允许我传递每个页面专用的其他变量?


阅读 539

收藏
2020-07-07

共1个答案

一尘不染

在有机会学习 Express 3 API Reference
之后,我发现了我想要的东西。具体来说,关于条目的内容
app.locals
,然后再往下一点,
res.locals
保存了我需要的答案。

我自己发现该函数app.locals接受一个对象并将其所有属性存储为作用于应用程序的全局变量。这些全局变量作为局部变量传递给每个视图。res.locals但是,该函数的作用域是请求,因此,响应局部变量仅可用于在特定请求/响应过程中呈现的视图。

所以对于我来说,我app.js所做的就是添加:

app.locals({
    site: {
        title: 'ExpressBootstrapEJS',
        description: 'A boilerplate for a simple web application with a Node.JS and Express backend, with an EJS template with using Twitter Bootstrap.'
    },
    author: {
        name: 'Cory Gross',
        contact: 'CoryG89@gmail.com'
    }
});

然后,所有这些变量都在我的意见,访问site.titlesite.descriptionauthor.nameauthor.contact

我还可以使用定义每个请求响应的局部变量res.locals,或者简单地将诸如页面标题之类的变量作为调用中的options参数传递render

编辑: 此方法将 不会
让你在你的中间件使用这些本地人。实际上,正如Pickels在下面的评论中建议的那样,我确实碰到了这一点。在这种情况下,您将需要在他的替代(和赞赏的)答案中创建一个中间件功能。您的中间件功能需要res.locals为每个响应将它们添加到中,然后调用next。该中间件功能将需要放在需要使用这些本地语言的任何其他中间件之上。

编辑:
通过app.locals和声明局部变量之间的另一个区别res.locals是,app.locals变量被设置为单个时间,并在应用程序的整个生命周期中持续存在。res.locals在中间件中设置本地人时,每次收到请求时都会进行设置。基本上,您应该更喜欢通过设置全局变量,app.locals除非该值取决于req传递给中间件的请求变量。如果该值未更改,则只需将其设置一次将更加有效app.locals

2020-07-07