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

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

全兴运
2023-03-14
问题内容

好的,所以我使用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。有没有办法做到这一点,并且仍然允许我传递每个页面专用的其他变量?


问题答案:

在有机会学习 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



 类似资料:
  • 问题内容: 我有一个main.go文件,其中有: 在我要声明,可在我的应用程序的任何地方访问的全局变量。有可能吗?我试过了: 但是,即使在同一包中,我也无法访问变量。 问题答案: 在顶层声明变量-在任何函数之外: 由于变量的名称以大写字母开头,因此在导入定义变量的包并使用包名对其进行限定时,变量将在当前包中通过其名称可用-在任何其他包中都可用。 这是另一个示例(同样在Go游乐场中:https :

  • 问题内容: 例如,我想使用自定义记录器: 如何在其他模块而不是console.log中使用此记录器? 问题答案: 大多数人建议不要使用全局变量。如果要在不同模块中使用相同的记录器类,则可以执行此操作 logger.js foob​​ar.js 如果确实需要全局变量,则可以执行以下操作:

  • 问题内容: 如何在其他.go包/文件中的main.go中访问已声明/初始化的变量?不断告诉我变量未定义(我知道全局变量不好,但这只是用作时间戳记) 在main.go中 尝试访问其他.go文件中的StartTime,但保持未定义StartTime 问题答案: 我将改为“注入” starttime变量,否则在软件包之间会有循环依赖关系。 main.go otherpackage.go

  • 问题内容: 在我的android应用程序中,我需要放置可变成员id的位置。问题是,它是从在线API获取的,我需要找到一种存储/检索它的方法 我尝试将其放在自定义类中,但是问题是,如果我取消活动,它将丢失,我还知道有一种方法可以扩展应用程序。 所以我想知道存储全局变量的最佳方法是什么? 我必须实现: 将变量保存在onSaveState上 将其保存在sharepref 手动保存 手动检索 谢谢 更新:

  • 问题内容: 我试图设置一个全局变量。就我而言,只是一个布尔标志,用于指示是否首次显示视图: 呈现视图后,我想将此标志设置为false: 然后检查它: 因此,我想创建一个全局变量。在哪里以及如何?我试过了: 在我的视图控制器领域 在我的AppDelegate.swift文件中的方法中 在班上 没运气。我收到一条错误消息 (注意:我意识到,在这个问题中,我背叛了我对Swift中如何处理范围的无知。请原

  • 问题内容: 我有一个全局变量,需要在我的ViewController之间共享。 在Objective-C中,我可以定义静态变量,但是找不到在Swift中定义全局变量的方法。 您知道这样做的方法吗? 问题答案: 来自官方的Swift编程指南: 全局变量是在任何函数,方法,闭包或类型上下文之外定义的变量。全局常数和变量总是延迟计算的。 您可以在任何文件中定义它,也可以在任何位置访问它。因此,您可以在任