Nodejs ejs 写法 req is not defined
Nodejs ejs 写法 req is not defined
6| </head>
7| <body>
>> 8| <%if(req.session.user){%>
9| <%=req.session.user%>
10| <%}%>
11| </body>
req is not defined
不能这样写?
当在EJS模板中使用req
对象时,需要确保req
对象已经通过Express框架传递给模板。在Express应用中,通常在渲染视图时会将req
对象作为上下文的一部分传递给EJS模板。如果直接在EJS模板中尝试访问req
对象而没有正确地将其包含在上下文中,就会出现req is not defined
的错误。
示例代码
首先,我们来看一个简单的Express应用示例,该应用使用EJS作为模板引擎,并且正确地传递了req
对象:
// app.js
const express = require('express');
const path = require('path');
const app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.get('/', (req, res) => {
// 假设用户已登录并设置了一个名为'user'的session
req.session.user = 'John Doe';
// 渲染EJS模板,并将req对象传递给模板
res.render('index', { req: req });
});
app.listen(3000, () => {
console.log('App listening on port 3000!');
});
接下来是EJS模板文件(views/index.ejs
)的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>EJS Example</title>
</head>
<body>
<!-- 正确访问req对象 -->
<% if(req.session.user) { %>
<%= req.session.user %>
<% } %>
</body>
</html>
解释
- 在Express应用中,我们设置了EJS作为默认的视图引擎。
- 当路由
/
被访问时,我们创建了一个模拟的用户会话(req.session.user
),然后通过res.render
方法渲染index.ejs
模板,并将当前请求对象req
作为参数传递给模板。 - 在EJS模板中,我们正确地访问了传递进来的
req
对象来检查用户的会话信息,并显示用户名。
这样,当页面加载时,如果用户已经登录,用户名将被显示出来。如果未定义或未传递req
对象,将不会抛出req is not defined
的错误。
你把req对象带进去了么?
答案肯定是他没带进去咯
确实没…
在EJS模板中,req
对象并没有直接暴露给模板。req
是Express中间件中的一个对象,它在处理HTTP请求时传递给路由处理函数。因此,在EJS模板中访问req
对象需要通过其他方式传递。
你可以通过以下两种方式解决这个问题:
方法一:在渲染模板时传递数据
在你的Express路由处理函数中,你可以将req
对象中的信息作为变量传递给EJS模板:
app.get('/example', (req, res) => {
res.render('yourTemplate', { user: req.session.user });
});
然后在EJS模板中使用传递的变量:
<% if(user) { %>
<%= user %>
<% } %>
示例代码
假设你有一个简单的Express应用,并且你想在登录后显示用户名,可以按照以下方式设置:
server.js
const express = require('express');
const session = require('express-session');
const app = express();
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true
}));
app.set('view engine', 'ejs');
app.get('/login', (req, res) => {
// 登录逻辑
req.session.user = 'John Doe';
res.redirect('/example');
});
app.get('/example', (req, res) => {
res.render('index', { user: req.session.user });
});
app.listen(3000);
views/index.ejs
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<% if(user) { %>
<p>Welcome, <%= user %>!</p>
<% } else { %>
<p>You are not logged in.</p>
<% } %>
</body>
</html>
方法二:在模板中直接访问req(不推荐)
虽然可以在模板中直接访问req
对象,但这通常不被推荐,因为这会使模板与业务逻辑耦合在一起,不利于维护。
你可以通过如下方式实现:
app.use((req, res, next) => {
res.locals.req = req;
next();
});
然后在EJS模板中就可以访问req
对象了:
<% if(req.session.user) { %>
<%= req.session.user %>
<% } %>
这种方式应该谨慎使用,因为它会使得模板依赖于外部上下文。