Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用Express/Node.JS创建在所有视图中可访问的全局变量?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
好吧,所以我使用 Jekyll建立了一个博客,你可以在文件_config.yml中定义变量,可以在所有的模板/布局中访问。我目前使用 Node.JS/ ExpressEJS模板和 ejs-locals(对于局部/布局,我正在寻找做类似于全球变量,如site.title,在_config.yml中发现如果任何人都熟悉jekyll。我有变量例如网站的标题(而不是网页标题),作者/公司名称,在我的所有网页上保持不变。

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

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',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.title,site.description,author.name,author.contact。

我也可以为res.locals的每个响应定义局部变量,或者简单地传递像页面标题一样的变量作为render调用中的optionsparameter。

编辑:此@L_616_34@将不允许您在中间件中使用这些本地化。我实际上确实遇到这个Pickels建议在下面的评论在这种情况下,您需要在他的替代(和赞赏)答案中创建一个中间件函数。您的中间件函数将需要将它们添加到res.locals中为每个响应,然后调用next。此中间件函数将需要放置在任何其他需要使用这些本地化的中间件之上。

编辑:通过app.locals声明局部变量和res.locals声明局部变量之间的一个区别是,使用app.locals,变量被设置一次并在应用程序的整个生命周期中持续。当您在中间件中使用res.locals设置本地时,这些都是在您每次收到请求时设置的。你应该基本上更喜欢通过app.locals设置全局变量,除非该值取决于传递到中间件的请求req变量。如果值不改变,那么在app.locals中只设置一次它将更有效。

大佬总结

以上是大佬教程为你收集整理的如何使用Express/Node.JS创建在所有视图中可访问的全局变量?全部内容,希望文章能够帮你解决如何使用Express/Node.JS创建在所有视图中可访问的全局变量?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。