express - 在 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() 即可按预期工作。
解决方案
事实证明,有几个用于闪烁的选项:
"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 作为参数显式传递给模板。
推荐阅读
- react-native - 如何将对讲聊天集成到 react-naive 移动应用程序?
- python - 如何使用数据框计算每小时的某些值
- r - 稀疏矩阵的 R repmat 函数
- android - Android 依赖 com.google.firebase:firebase-core 编译(12.0.1)和运行时(11.4.2)的不同版本
- c# - LTV 认证签名后,PDF 显示“文档已更改”
- ios - iOS 中的键盘输入速度非常慢
- c# - 使用 OWIN 自托管 WebApi 配置 IdentityServer4
- google-assistant-sdk - 在非 GMS android 版本上安装谷歌助手库
- security - grails中的acl使用角色
- awk - 使用 awk 将文本文件的内容汇总到另一个文件