node.js - express js错误 - 发送后无法设置标题
问题描述
我正在尝试使用 express js 创建一个登录系统。它工作正常,但登录后在终端中打印错误。这是错误:
Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (/home/amruth/softwareproject/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/home/amruth/softwareproject/node_modules/express/lib/response.js:170:12)
at done (/home/amruth/softwareproject/node_modules/express/lib/response.js:1008:10)
at Object.exports.renderFile (/home/amruth/softwareproject/node_modules/pug/lib/index.js:446:12)
at View.exports.__express [as engine] (/home/amruth/softwareproject/node_modules/pug/lib/index.js:491:11)
at View.render (/home/amruth/softwareproject/node_modules/express/lib/view.js:135:8)
at tryRender (/home/amruth/softwareproject/node_modules/express/lib/application.js:640:10)
at Function.render (/home/amruth/softwareproject/node_modules/express/lib/application.js:592:3)
at ServerResponse.render (/home/amruth/softwareproject/node_modules/express/lib/response.js:1012:7)
at /home/amruth/softwareproject/routes.js:116:11
at Layer.handle [as handle_request] (/home/amruth/softwareproject/node_modules/express/lib/router/layer.js:95:5)
at next (/home/amruth/softwareproject/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/amruth/softwareproject/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/amruth/softwareproject/node_modules/express/lib/router/layer.js:95:5)
这是代码:
router.get('/signup', function (req, res) {
res.render('signup');
});
router.post('/signup', function (req, res) {
if (!req.body.gmail || !req.body.password) {
res.status("400");
res.send("Invalid details");
}
else {
Users.filter(function (user) {
if (user.gmail == req.body.gmail) {
console.log(user.gmail);
res.render('signup', { message: "Gmail already exists" });
}
});
var newUser = { gmail: req.body.gmail, password: req.body.password };
Users.push(newUser);
console.log(Users.length);
req.session.user = newUser;
console.log(req.session.user);
res.redirect('/secret');
}
});
function checkSignIn(req, res, next) {
if (req.session.user) {
next();
}
else {
var err = new Error("Not logged in!");
next(err);
}
}
router.get('/secret', checkSignIn, function (req, res) {
res.render('secret', { id: req.session.user.gmail });
});
router.get('/login', function (req, res) {
res.render('login');
});
router.post('/login', function (req, res) {
//console.log(Users);
if (!req.body.gmail || !req.body.password) {
res.render('login', { message: "Please enter valid info" });
}
else {
Users.filter(function (user) {
if (user.gmail == req.body.gmail && user.password == req.body.password) {
req.session.user = user;
res.redirect('/secret');
}
});
res.render('login', { message: "Invalid credentials" });
}
});
router.get('/logout', function (req, res) {
req.session.destroy(function () {
console.log("user logged out.")
});
res.redirect('/login');
});
router.use('/secret', function (err, req, res, next) {
console.log(err);
res.redirect('/login');
});
解决方案
这是因为即使您已经发送(在检查了匹配电子邮件 ID 等条件之后),您仍在发送响应。return
发送响应后,使用关键字停止执行以下代码行。例如:
if(!req.body.gmail || !req.body.password)
{
return res.status("400").send("Invalid details");
}
还要注意,您可以像这样将状态代码与响应对象附加在一起
推荐阅读
- c# - c# iText7 - 通过 pdf 图像进行交互并更改大小和 dpi
- http - Oauth Jmeter 负载测试
- c++ - 使用 Allegro 5 和 mingw-w64 的未定义引用
- amazon-web-services - AWS Cognito 更改用户密码
- android - PrimeNG 下拉菜单被移动设备上的键盘隐藏
- java - JasperReports 图表未由 JRBeanCollectionDataSource 填充
- amazon-web-services - AWS Kinesis 序列号
- c# - 避免在 Asp.net 核心的 xmlroot 中编码特殊字符
- sql - Sum according to the combination of another table in sql
- windows - IntelliJ 通过配置文件禁用使用统计/数据共享