Nodejs 关于req.session 替换 req.flash

Nodejs 关于req.session 替换 req.flash

新版本的express取消了req.flash,建议直接使用req.session (just use sessions: req.session.messages = [‘foo’] etc)

按照之前req.flash的介绍:通过它保存的变量生命周期是用户当前和下一次请求,之后会被清除。 如果所有仅需要request作用域使用的变量全部都存放在req.session,那么每次用完岂不是还要不停得手工将req.session中没用的变量置为null???

9 回复

Node.js 关于 req.flash 替换为 req.session

在较新的版本中,Express 已经移除了 req.flash 功能,推荐直接使用 req.session 来实现类似的功能。req.flash 主要用于在一次请求到另一次请求之间临时存储信息(例如错误消息、成功消息等)。然而,现在你可以通过 req.session 来实现相同的效果。

示例代码

假设我们有一个简单的 Express 应用程序,需要在两次请求之间传递消息。我们将使用 req.session 来实现这一点。

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('/show-message', (req, res) => {
  if (req.session.messages) {
    const message = req.session.messages.pop(); // 获取并删除消息
    res.send(message);
  } else {
    res.send('No messages available.');
  }
});

// 示例路由:设置一条消息
app.get('/set-message', (req, res) => {
  if (!req.session.messages) {
    req.session.messages = []; // 初始化消息数组
  }
  req.session.messages.push('Hello, this is a flash message!');
  res.redirect('/show-message'); // 跳转到显示消息的路由
});

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

解释

  1. 配置 Session

    • 我们使用 express-session 中间件来管理会话。secret 是一个密钥,用于加密会话数据。resavesaveUninitialized 参数分别控制是否重新保存未修改的会话以及是否在初始化时保存会话。
  2. 设置消息

    • /set-message 路由中,我们检查 req.session.messages 是否存在。如果不存在,则初始化一个空数组。然后,我们将消息添加到数组中,并重定向到 /show-message 路由。
  3. 显示消息

    • /show-message 路由中,我们从 req.session.messages 数组中获取并删除消息(使用 .pop() 方法),然后发送给客户端。如果没有消息,则返回 “No messages available.”。

通过这种方式,我们可以模拟 req.flash 的行为,同时利用 req.session 提供的持久性存储。这样做的好处是可以避免手动清理未使用的变量,因为会话会在适当的时机自动清理。


req.flash的原理就是這樣啊, 存儲在session裏面。取出一次之後就刪掉它。 如果不想手動實現也可以用npm install connect-flash模塊啊。

嗯,感谢,已经安装了connect-flash模块。

请问在ejs模板中如何获得session啊?貌似在ejs中无法直接操作session的。

将session的内容,存放到app.locals。

将session的内容,存放到app.locals。或者req.locals。

app.locals=req.locals 将变量同步到views

这个问题我没研究过,有一个关于 connect-flash 简单的例子可以实现connect-falsh 信息提示,但就不知道跟楼主的问题有没有关系 connect-flash 用法详解

试试自己写个connect-flash中间件 出来

当使用 req.flash 时,消息通常会在两次请求之间存储并自动清除。在新版 Express 中,req.flash 被移除,推荐使用 req.session 来实现类似功能。下面是如何使用 req.session 实现相同效果的方法:

示例代码

假设我们有一个简单的登录表单,提交后显示一条消息。

1. 安装必要的依赖

确保你已经安装了 express, express-session:

npm install express express-session

2. 设置中间件和路由

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

const app = express();

// 使用 session 中间件
app.use(session({
    secret: 'your_secret_key', // 这个值用于签名 session id 的 cookie
    resave: false,
    saveUninitialized: true
}));

// 登录表单处理
app.post('/login', (req, res) => {
    const { username } = req.body;
    if (username === 'admin') {
        // 添加消息到 session
        req.session.messages = req.session.messages || [];
        req.session.messages.push({ type: 'success', text: 'Login successful!' });
    } else {
        req.session.messages = req.session.messages || [];
        req.session.messages.push({ type: 'error', text: 'Invalid username.' });
    }
    res.redirect('/'); // 重定向到首页
});

// 显示消息
app.get('/', (req, res) => {
    const messages = req.session.messages || [];
    req.session.messages = []; // 清空消息
    res.send(`
        <form method="post" action="/login">
            <input type="text" name="username" placeholder="Username" />
            <button type="submit">Login</button>
        </form>
        ${messages.map(msg => `<div class="${msg.type}">${msg.text}</div>`).join('')}
    `);
});

app.listen(3000, () => console.log('Server started on port 3000'));

解释

  1. 设置中间件

    • 我们使用 express-session 中间件来管理会话数据。
    • secret 用于加密会话数据,防止篡改。
    • resavesaveUninitialized 控制如何处理未初始化的会话。
  2. 处理登录请求

    • /login 路由中,我们检查用户名是否正确。
    • 如果用户名正确,则向 req.session.messages 添加一条成功的消息。
    • 如果用户名错误,则添加一条错误消息。
  3. 显示消息

    • 在首页 / 路由中,从 req.session.messages 获取消息,并将其显示在页面上。
    • 显示完消息后,将 req.session.messages 置为空数组,以便下次请求不会重复显示旧消息。

这种方式可以有效地模拟 req.flash 的行为,同时利用了 req.session 的持久性。

回到顶部