Nodejs 在请求处理里面赋值的req.session.user 在ejs里要怎么才能拿到

Nodejs 在请求处理里面赋值的req.session.user 在ejs里要怎么才能拿到

在请求处理里面赋值的req.session.user 在ejs里要怎么才能拿到啊?req、 session、 request都说没undefied??

9 回复

帖子内容:Nodejs 在请求处理里面赋值的req.session.user 在ejs里要怎么才能拿到

问题描述

在使用 Node.js 和 Express 框架时,有时候我们会将用户信息存储在 req.session.user 中。然而,在尝试通过 EJS 模板引擎访问 req.session.user 时,可能会遇到 reqsessionrequest 未定义的情况。

解决方案

  1. 确保会话中间件已安装并正确配置 首先,你需要确保已经安装了 express-session 中间件,并且在 Express 应用中正确地配置了它。

    npm install express-session
    

    然后,在你的应用入口文件(例如 app.jsserver.js)中配置会话中间件:

    const express = require('express');
    const session = require('express-session');
    
    const app = express();
    
    // 配置会话中间件
    app.use(session({
      secret: 'your_secret_key', // 用于加密会话数据的密钥
      resave: false,
      saveUninitialized: true,
      cookie: { secure: false } // 如果使用 HTTPS,可以设置为 true
    }));
    
    // 其他中间件和路由配置
    
  2. 在请求处理函数中设置 req.session.user

    在你的请求处理函数中,你可以设置 req.session.user,例如在登录成功后:

    app.post('/login', (req, res) => {
      // 假设验证成功后,获取用户信息
      const user = { id: 1, name: 'John Doe' };
      
      // 将用户信息保存到会话中
      req.session.user = user;
    
      res.redirect('/');
    });
    
  3. 在 EJS 模板中访问 req.session.user

    在你的 EJS 模板中,你可以通过传递给模板的数据来访问 req.session.user。通常情况下,你可以在渲染视图之前将 req.session.user 作为变量传递给模板。

    app.get('/', (req, res) => {
      res.render('index', { user: req.session.user });
    });
    

    在 EJS 模板中,你可以这样访问 user 变量:

    <!DOCTYPE html>
    <html>
    <head>
      <title>Welcome</title>
    </head>
    <body>
      <% if (user) { %>
        <h1>Welcome, <%= user.name %>!</h1>
      <% } else { %>
        <h1>Welcome, Guest!</h1>
      <% } %>
    </body>
    </html>
    

总结

通过上述步骤,你可以确保在请求处理函数中设置的 req.session.user 能够在 EJS 模板中正确访问。关键是正确配置会话中间件,并确保在渲染模板时传递必要的数据。


render 的时候要把这个参数传进去才行。

那我要在页面判断是否登录了,如果有很多页面不是要传很多次

res.locals

在页面 怎么拿?

看了下文档,这个确实好用。

res.locals.errmsg = req.session.errmsg; 界面是直接<%= errmsg%>

一般来说,可以这样写,类似一个拦截器,注意要写在路由的前面: app.use(function(req, res, next){ res.locals.errmsg = req.session.errmsg; next(); }); app.use(’/’, routes);//路由

如果路由写在前面了,就不成了,

当然,你也可以每次请求的时候,都写上 res.locals.errmsg = req.session.errmsg; 这样ejs就能拿到。

楼上的,你回的是坟贴哦。

要在EJS模板中访问req.session.user,你需要确保以下几点:

  1. 你已经正确配置了Session中间件(例如express-session)。
  2. 在请求处理程序中设置了req.session.user
  3. 在渲染EJS模板时,将req对象传递给模板。

以下是一个简单的示例代码,展示如何在请求处理中设置req.session.user并在EJS模板中获取它:

示例代码

服务器端代码(使用Express)

const express = require('express');
const session = require('express-session');

const app = express();

// 使用session中间件
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true
}));

// 设置路由
app.get('/login', (req, res) => {
    // 假设用户登录成功
    req.session.user = { name: 'John Doe' };
    res.render('login', { user: req.session.user });
});

app.get('/', (req, res) => {
    res.render('home', { user: req.session.user });
});

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

EJS模板(login.ejs)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
    <% if (user) { %>
        <h1>Welcome, <%= user.name %>!</h1>
    <% } else { %>
        <h1>Please login</h1>
    <% } %>
</body>
</html>

EJS模板(home.ejs)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home Page</title>
</head>
<body>
    <% if (user) { %>
        <h1>Welcome back, <%= user.name %>!</h1>
    <% } else { %>
        <h1>Please login first</h1>
    <% } %>
</body>
</html>

解释

  1. Session中间件express-session用于管理会话。确保你已经在应用中正确安装并使用了它。
  2. 设置用户信息:在登录成功后,将用户信息存储在req.session.user中。
  3. 渲染模板:在渲染EJS模板时,将req.session.user传递给模板,这样在模板中就可以直接访问user变量。

通过这种方式,你可以在EJS模板中轻松访问到req.session.user中的数据。

回到顶部