好的,我用Jekyll创建了一个博客,你可以在_config.yml文件中定义变量,这些变量可以在所有模板/布局中访问.我目前使用Node.JS/Express,有EJS个模板和ejs-locals个模板(用于部分/布局).如果有人熟悉Jekyll,我希望做一些类似于_config.yml中的site.title这样的全局变量的事情.我有一些变量,比如网站标题(而不是页面标题)、作者/公司名称,它们在我的所有页面上都保持不变.

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

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个 case 中,我所做的是添加:

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 for each 请求响应定义局部变量,或者简单地将页面标题等变量作为render调用中的options参数传入.

EDIT:此方法将允许您在中间件中使用这些局部变量.正如皮克尔斯在下面的 comments 中所说,我确实遇到过这种情况.在这种情况下,您将需要在他的备选答案中创建一个中间件功能.您的中间件功能需要 for each 响应将它们添加到res.locals,然后调用next.该中间件功能需要置于需要使用这些局部变量的任何其他中间件之上.

EDIT:通过app.localsres.locals声明局部变量之间的另一个区别是,对于app.locals,变量只设置一次,并在应用程序的整个生命周期中保持不变.当您在中间件中将局部变量设置为res.locals时,每次收到请求时都会设置这些局部变量.基本上,您应该更喜欢通过app.locals设置globals,除非该值取决于传递到中间件的request req变量.如果该值不变,则每app.locals次设置一次会更有效.

Node.js相关问答推荐

如何在MEVN堆栈中结合创建和更新表单流程?

是否可以在MongoDB中比较和匹配引用文档中的字段

无法使用NPM安装REDUX和DATEPPICER

获取页面大小为10的所有文章,每篇文章填充一些所需的用户信息

Nestjs重写子类dto nodejs中的属性

构建期间 Docker 容器中的 npm 安装失败

将图像添加到多个产品的条带 checkout 会话中

使用单个 MongoDB 查询更新多个元素

Node fetch 实现似乎与 Deno 和 Bun 不同,导致网站没有返回响应?

如何使用Stripe测试失败的收费?

express cors request.body formData显示undefined

Fly.io 启动问题:无法从源获取图像或构建错误:构建错误:连接期间出错:发布...

在系统启动时启动本地 node 服务器

将 express js app.use() 移动到另一个文件

在新创建的 Angular 工作区上运行 ng lint 时出错

如何申请在NextJS上下载文件的许可?

使用restify时如何支持cors

NodeJS为exec设置环境变量

如何将`yarn.lock`与`package.json`同步?

无法获取 CSS 文件