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

不能这样写?


5 回复

当在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 %>
<% } %>

这种方式应该谨慎使用,因为它会使得模板依赖于外部上下文。

回到顶部