使用express+ejs开发遇到个小困惑 Nodejs
使用express+ejs开发遇到个小困惑 Nodejs
现在我要往模板中传递一些公共的变量,比如用户信息、权限信息等,需要每个render中写变量吗,除了这种方法有没有更优雅简洁的方法?
现在我要往模板中传递一些公共的变量,比如用户信息、权限信息等,需要每个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
时重复传递这些变量。以下是一种实现方式:
示例代码
-
安装依赖: 确保你已经安装了 Express 和 EJS。
npm install express ejs
-
创建 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'); });
-
EJS 模板: 在你的 EJS 模板中,可以直接访问
user
和permissions
变量。<!-- 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>
解释
通过上述方法,你可以在所有渲染的模板中自动获得 user
和 permissions
变量,而无需在每次调用 res.render
时显式传递这些变量。这种方式不仅减少了代码冗余,还提高了代码的可维护性。