首页 > 解决方案 > 在 flash() 之后立即重定向时出现 express.js 错误

问题描述

在重定向之前调用 flash() 时,我得到一个反复出现的错误。

代码是员工显示的简单处理:

const express = require('express')
const flash = require('express-flash-notification');
const cookieParser = require('cookie-parser');
const session = require('express-session');    
const app = express()

app.use(cookieParser())
app.use(session({
    secret: 'secretapp',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: true }
  }))
app.use(flash(app))

app.get('/employee/:id*?', (req, res) => {
    console.log('got a request to display');
    if (req.params.id) {
        console.log('got a request to display user ' + req.params.id);
        if (req.params.id==1234) {
            return res.render('employee.hbs', {
                first: "Holy",
                last: "Mitchell"
            });
        } else {
            // *********** I get an error only when flashing:
            req.flash('warning', 'Employee does not exist')
            // *********** No error when commenting out req.flash()
            return res.redirect('/employee/');
        }
    } else {
        return res.render('employee_lookup.hbs');
    }
});

错误看起来像这样(我得到了几十个这个错误):

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (.../addressbook/node_modules/express/lib/response.js:767:10)
    at ServerResponse.location (.../addressbook/node_modules/express/lib/response.js:884:15)
    at ServerResponse.redirect (.../addressbook/node_modules/express/lib/response.js:922:18)
    at app.get (.../addressbook/index.js:37:24)
    at Layer.handle [as handle_request] (.../addressbook/node_modules/express/lib/router/layer.js:95:5)
    at next (.../addressbook/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (.../addressbook/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (.../addressbook/node_modules/express/lib/router/layer.js:95:5)
    at .../addressbook/node_modules/express/lib/router/index.js:281:22

再次强调一下,无需调用 flash() 即可按预期工作。

标签: express

解决方案


事实证明,有几个用于闪烁的选项:

"connect-flash": "^0.1.1",
"express-flash-messages": "^0.1.1",
"express-flash-notification": "^0.5.0",
"flash": "^1.1.0",

我最终使用了连接闪存:

app.get('/employee/:id*?', (req, res) => {
    if (req.params.id) {
        console.log('got a request to display user ' + req.params.id);
        if (req.params.id==1234) {                
            return res.render('employee.hbs', {
                first: "Holy",
                last: "Mitchell",
                pic: "https://randomuser.me/api/portraits/women/63.jpg"
            });
        } else {
            req.flash('info', `Employee not found`);
            return res.redirect('/employee/');
        }
    } else {
        return res.render('employee_lookup.hbs', { messages: req.flash('info') });
    }
});

...这很好用。

我还了解到我需要将 flash 作为参数显式传递给模板。


推荐阅读