Nodejs Object #<IncomingMessage> has no method 'flash'

Nodejs Object #<IncomingMessage> has no method 'flash’

比如表单提交后想给用户一个提示,然后再跳转到一个页面 用网上的例子

req.flash('info', 'join success')
res.redirect('/mixin', {reg_msg:'username'});

这样提示,Object #<IncomingMessage> has no method 'flash’

网上搜索了一下好象是express3不能用req.flash https://github.com/visionmedia/express/issues/1170 那要用户一个提示,一般是怎么处理呢?


8 回复

标题:Node.js 中 Object #<IncomingMessage> has no method 'flash' 错误

内容:

当你尝试在 Node.js 应用程序中使用 req.flash('info', 'join success') 这样的代码时,可能会遇到错误信息 Object #<IncomingMessage> has no method 'flash'。这是因为 req.flash 方法并不是 Node.js 原生的一部分,而是在 Express 3.x 版本之后被移除的。如果你正在使用的是较新的版本(如 Express 4 或更高),你需要使用其他方法来实现相同的功能。

如何处理用户提示?

一种常见的处理方式是使用会话(session)或者直接在响应对象(res)中存储消息,并在前端通过 JavaScript 来读取这些消息并显示出来。这里我将展示如何使用会话来实现这一功能。

示例代码:

首先确保你已经安装了 express-sessionconnect-flash 模块。如果没有安装,可以通过以下命令安装:

npm install express-session connect-flash --save

然后,在你的 Express 应用程序中设置中间件:

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

const app = express();

// 设置会话中间件
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true
}));

// 设置闪现消息中间件
app.use(flash());

// 路由处理
app.post('/submit-form', (req, res) => {
    // 存储闪现消息
    req.flash('success', 'Join successful!');
    res.redirect('/mixin');
});

app.get('/mixin', (req, res) => {
    // 获取闪现消息并在视图中渲染
    const successMessages = req.flash('success');
    res.render('mixin', { messages: successMessages });
});

在这个例子中,我们使用了 connect-flash 库来处理闪现消息。当用户提交表单时,我们使用 req.flash('success', 'Join successful!') 存储一条成功消息。然后重定向到 /mixin 页面。在 /mixin 页面上,我们获取并显示这条消息。

视图模板示例(使用 EJS)

假设你使用的是 EJS 作为模板引擎,你可以这样写:

<!-- mixin.ejs -->
<!DOCTYPE html>
<html>
<head>
    <title>Mixin Page</title>
</head>
<body>
    <% if (messages.length > 0) { %>
        <div>
            <% messages.forEach(function(message) { %>
                <p><%= message %></p>
            <% }); %>
        </div>
    <% } %>
    <!-- 其他内容 -->
</body>
</html>

这样,当用户访问 /mixin 页面时,他们将看到之前保存的消息。

通过这种方式,你可以避免使用已废弃的方法,并且能够有效地向用户提供反馈信息。


这个安装了

是使用的是express3.3.1,装了connect-flash,然后也给express 配置了flash eg:app.use(flash()),但是还是报 Object #<IncomingMessage> has no method ‘flash’

flash方法不推荐使用,请将消息放到res中返回

试着将这两行代码放一起,放在session模块之后,这两个又放在其它模块之前 var flash = require(‘connect-flash’); app.use(flash());

你遇到的错误是因为 req.flash 方法在 Express 4 及以上版本中已被移除。Express 4 将闪现消息(flash messages)的逻辑分离到了一个独立的中间件 connect-flash 中。

你可以通过安装并使用 connect-flash 来实现闪现消息的功能。以下是具体步骤和示例代码:

安装依赖

首先,你需要安装 connect-flash

npm install connect-flash

示例代码

然后,在你的 Express 应用中引入并使用 connect-flash

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

const app = express();

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

// 使用connect-flash中间件
app.use(flash());

// 示例路由:表单提交后的处理
app.post('/submit-form', (req, res) => {
    req.flash('info', 'join success');
    res.redirect('/mixin');
});

// 在视图模板中获取并显示闪现消息
app.get('/mixin', (req, res) => {
    const infoMessages = req.flash('info');
    res.render('mixin', { reg_msg: 'username', infoMessages });
});

视图模板中的展示

在你的视图模板(例如 EJS)中,可以这样展示闪现消息:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Mixin Page</title>
</head>
<body>
    <% if (infoMessages.length) { %>
        <div class="alert alert-info">
            <% infoMessages.forEach(function(message) { %>
                <%= message %>
            <% }); %>
        </div>
    <% } %>
    <!-- 其他内容 -->
</body>
</html>

解释

  1. 安装:安装 connect-flashexpress-session
  2. 使用中间件:使用 express-sessionconnect-flash 中间件。
  3. 存储消息:在表单提交后,使用 req.flash('info', 'message') 存储闪现消息。
  4. 获取并展示消息:在目标页面中获取并展示这些消息。

这样,你就可以在表单提交后给用户一个提示,并且在重定向到另一个页面时展示该提示。

回到顶部