Nodejs 通过dynamicHelper方法设的全局变量怎么在ejs模板中获取

Nodejs 通过dynamicHelper方法设的全局变量怎么在ejs模板中获取

通过官方文档的介绍这样弄的 app.use(function(req,res,next){ res.locals.headers = {name:‘leike’,gread:4}; next(); });

在模板中获取的时候总是显示headers is not difined ,这是出了什么问题?

3 回复

Nodejs 通过dynamicHelper方法设的全局变量怎么在EJS模板中获取

问题描述

在使用Node.js和EJS模板引擎时,你可能希望在每个请求中设置一些全局变量(例如头部信息),以便在模板中使用。然而,当你尝试通过res.locals来设置这些变量时,却发现它们在模板中无法被正确访问。

示例代码

假设你有一个简单的Express应用,并且想要在每个请求中设置一些头部信息,然后在EJS模板中使用这些信息。

const express = require('express');
const app = express();
const port = 3000;

// 设置EJS作为模板引擎
app.set('view engine', 'ejs');

// 在每次请求时设置全局变量
app.use((req, res, next) => {
    res.locals.headers = { name: 'leike', grade: 4 };
    next();
});

// 定义一个路由,渲染一个简单的模板
app.get('/', (req, res) => {
    res.render('index', {
        title: 'Home Page',
        message: 'Welcome to the home page!'
    });
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}/`);
});

在这个例子中,我们使用res.locals在每次请求时设置了一个名为headers的全局变量。res.locals对象是一个可写对象,可以用来存储在当前请求中需要传递给视图的数据。

在EJS模板中使用全局变量

接下来,在你的EJS模板文件(例如views/index.ejs)中,你可以直接访问这些全局变量:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= title %></title>
</head>
<body>
    <h1><%= message %></h1>
    <% if (locals.headers) { %>
        <p>Name: <%= locals.headers.name %>, Grade: <%= locals.headers.grade %></p>
    <% } else { %>
        <p>Headers are not defined.</p>
    <% } %>
</body>
</html>

在这个EJS模板中,我们首先检查locals.headers是否存在。如果存在,我们就显示它的值;否则,显示一条提示信息。

常见错误及解决方法

如果你遇到headers is not defined的错误,可能是因为你在模板中直接访问了headers而没有检查它是否已经被正确地设置。确保你使用locals.headers而不是直接访问headers

通过上述步骤,你应该能够成功地在EJS模板中访问由res.locals设置的全局变量。


http://expressjs.com/4x/api.html express 4里面好像早就没有dynamicHelper了吧。

在Node.js中,使用res.locals设置的变量可以在EJS模板中直接访问。而dynamicHelper方法是Express框架早期版本中的一个概念,在现代Express版本中已经不推荐使用了。你提到的方法是通过中间件设置res.locals,这是正确的做法。

以下是一个示例代码,展示了如何通过中间件设置res.locals并在EJS模板中访问这些变量:

示例代码

服务器端代码 (app.js)

const express = require('express');
const app = express();
app.set('view engine', 'ejs');

// 设置 res.locals 变量
app.use((req, res, next) => {
    res.locals.headers = { name: 'leike', grade: 4 };
    next();
});

// 路由
app.get('/', (req, res) => {
    res.render('index'); // 渲染 EJS 模板
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

EJS 模板 (views/index.ejs)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Example</title>
</head>
<body>
    <h1>Welcome to the page!</h1>
    <p>Name: <%= headers.name %></p>
    <p>Grade: <%= headers.grade %></p>
</body>
</html>

解释

  1. 中间件:

    • 在中间件函数中,我们通过res.locals.headers设置了一个对象。
    • next()函数用于传递控制到下一个中间件或路由处理程序。
  2. EJS 模板:

    • 在EJS模板中,可以直接使用<%= headers.name %><%= headers.grade %>来访问res.locals中的变量。
    • <%= 是EJS语法的一部分,表示输出变量的值。

如果你在EJS模板中遇到“headers is not defined”的错误,可能是因为你没有正确地设置res.locals或者你的模板引擎配置有问题。确保你的Express应用正确设置了EJS作为视图引擎,并且中间件按顺序正确执行。

回到顶部