使用express+ejs开发遇到个小困惑 Nodejs

使用express+ejs开发遇到个小困惑 Nodejs

现在我要往模板中传递一些公共的变量,比如用户信息、权限信息等,需要每个render中写变量吗,除了这种方法有没有更优雅简洁的方法?

6 回复

现在我要往模板中传递一些公共的变量,比如用户信息、权限信息等,需要每个render中写变量吗,除了这种方法有没有更优雅简洁的方法?


不是有中间件,每个指定的URL都会经过

当然可以!在Express应用中使用EJS作为模板引擎时,确实会遇到需要在多个页面中传递相同数据的情况。这种情况下,手动在每次调用res.render()时都添加这些变量显然不够优雅且容易出错。幸运的是,Express提供了几种方法来解决这个问题。

方法一:中间件

你可以创建一个中间件函数,在渲染视图之前自动将这些公共变量添加到渲染上下文中。以下是一个简单的例子:

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

// 假设我们有一个函数来获取当前用户的信息
function getCurrentUser(req, res) {
    return { name: 'John Doe', role: 'admin' };
}

// 中间件来设置公共变量
app.use((req, res, next) => {
    res.locals.user = getCurrentUser(req, res);
    next();
});

// 示例路由
app.get('/', (req, res) => {
    res.render('index', { message: 'Hello World!' });
});

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

在这个例子中,我们定义了一个getCurrentUser函数来模拟获取用户信息的过程,并通过中间件将该信息添加到了res.locals对象中。这样,在所有后续的视图渲染过程中,都可以直接访问到user变量。

方法二:自定义渲染函数

如果你希望更灵活地控制哪些路由或视图需要这些公共变量,也可以考虑创建一个辅助函数来封装res.render方法:

function renderWithUser(res, viewName, options = {}) {
    options.user = getCurrentUser();
    res.render(viewName, options);
}

app.get('/profile', (req, res) => {
    renderWithUser(res, 'profile', { message: 'Welcome to your profile page.' });
});

通过这种方式,你可以在需要的地方调用renderWithUser函数,而不是每次都重复相同的代码逻辑。

这两种方法都能有效地减少重复代码并提高代码的可维护性。选择哪种方法取决于你的具体需求和项目结构。

res.locals.user

1L正解,自己写一个中间件,use

在使用 Express 和 EJS 开发时,你可以通过中间件来全局共享一些变量(如用户信息、权限信息等),这样就不用在每次调用 res.render 时重复传递这些变量。以下是一种实现方式:

示例代码

  1. 安装依赖: 确保你已经安装了 Express 和 EJS。

    npm install express ejs
    
  2. 创建 Express 应用并设置 EJS: 在你的应用入口文件(例如 app.js)中,设置 EJS 引擎,并创建一个中间件来向模板传递全局变量。

    const express = require('express');
    const app = express();
    
    // 设置视图引擎为 EJS
    app.set('view engine', 'ejs');
    
    // 创建一个中间件,用于在渲染时传递全局变量
    app.use((req, res, next) => {
      // 这里假设我们从 session 中获取用户信息
      const user = req.session.user;
      const permissions = req.session.permissions;
    
      // 将变量添加到 res.locals 对象中,以便在所有模板中使用
      res.locals.user = user;
      res.locals.permissions = permissions;
    
      // 继续处理请求
      next();
    });
    
    // 示例路由
    app.get('/', (req, res) => {
      // 渲染模板时不需要手动传递 user 和 permissions 变量
      res.render('index');
    });
    
    // 启动服务器
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
    });
    
  3. EJS 模板: 在你的 EJS 模板中,可以直接访问 userpermissions 变量。

    <!-- views/index.ejs -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Example Page</title>
    </head>
    <body>
      <% if (user) { %>
        <p>Welcome, <%= user.name %>!</p>
        <% if (permissions.includes('admin')) { %>
          <p>You have admin privileges.</p>
        <% } %>
      <% } else { %>
        <p>Please log in to view this page.</p>
      <% } %>
    </body>
    </html>
    

解释

通过上述方法,你可以在所有渲染的模板中自动获得 userpermissions 变量,而无需在每次调用 res.render 时显式传递这些变量。这种方式不仅减少了代码冗余,还提高了代码的可维护性。

回到顶部