这是我的特快航线代码。 当我尝试删除或张贴在邮递员中时,在控制台中出现此错误
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:485:11)
at ServerResponse.header (/Users/ivanolvera/Movvel/Server/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/Users/ivanolvera/Movvel/Server/node_modules/express/lib/response.js:170:12)
at Query.<anonymous> (/Users/ivanolvera/Movvel/Server/src/routes/modelo.js:56:9)
at Query.<anonymous> (/Users/ivanolvera/Movvel/Server/node_modules/mysql/lib/Connection.js:526:10)
at Query._callback (/Users/ivanolvera/Movvel/Server/node_modules/mysql/lib/Connection.js:488:16)
at Query.Sequence.end (/Users/ivanolvera/Movvel/Server/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
at Query.ErrorPacket (/Users/ivanolvera/Movvel/Server/node_modules/mysql/lib/protocol/sequences/Query.js:92:8)
at Protocol._parsePacket (/Users/ivanolvera/Movvel/Server/node_modules/mysql/lib/protocol/Protocol.js:291:23)
at Parser._parsePacket (/Users/ivanolvera/Movvel/Server/node_modules/mysql/lib/protocol/Parser.js:433:10) {
code: 'ERR_HTTP_HEADERS_SENT'
}
// delete by id
router.delete("/:idModelo", function(req, res, next) {
const id = req.params.idModelo;
const sql = `DELETE * FROM Modelo WHERE idModelo=${id}`;
pool.query(sql, function(err, row, fields) {
if (err) {
res.status(500).send({ error: "Something failed!" });
}
res.send("Deleted");
});
});
答案 0 :(得分:0)
router.delete("/:idModelo", function(req, res, next) {
const id = req.params.idModelo;
const sql = `DELETE * FROM Modelo WHERE idModelo=${id}`;
pool.query(sql, function(err, row, fields) {
if (err) {
res.status(500).send({ error: "Something failed!" });
return;
}
res.send("Deleted");
});
});
您忘记在第一个res
通话后输入收益。因此发生了什么事,因为它看到运行了第一个,而没有return
语句,所以它继续运行第二个。
因此您可以通过两种方式解决错误。将res.send
放在else
块中,或将return
关键字放在res.status
之后。它不必返回任何东西。您只需要向函数发送信号,即它在发送响应错误后应终止该函数。
答案 1 :(得分:0)
如果您pool.query()
遇到错误,则您将两次致电res.send()
:
router.delete("/:idModelo", function(req, res, next) {
const id = req.params.idModelo;
const sql = `DELETE * FROM Modelo WHERE idModelo=${id}`;
pool.query(sql, function(err, row, fields) {
if (err) {
res.status(500).send({ error: "Something failed!" }); // first time res.send()
}
res.send("Deleted"); // second time res.send()
});
});
请记住,尽管res.send()
完成了http响应,但是它不会停止Javascript中的控制流。如果您的函数中还有其他代码要执行,则该代码仍将运行。因此,遇到错误后,您需要if/else
或return
才能停止res.send("Deleted")
的运行。这是return
。
router.delete("/:idModelo", function(req, res, next) {
const id = req.params.idModelo;
const sql = `DELETE * FROM Modelo WHERE idModelo=${id}`;
pool.query(sql, function(err, row, fields) {
if (err) {
res.status(500).send({ error: "Something failed!" });
return; // <=== add this
}
res.send("Deleted");
});
});
还有一个if/else
:
router.delete("/:idModelo", function(req, res, next) {
const id = req.params.idModelo;
const sql = `DELETE * FROM Modelo WHERE idModelo=${id}`;
pool.query(sql, function(err, row, fields) {
if (err) {
res.status(500).send({ error: "Something failed!" });
} else {
res.send("Deleted");
}
});
});
如果在没有pool.query()
错误的情况下发生此“无法在将标头发送到客户端后设置标头”的错误,则必须在其他地方(也许是中间件)也有一些代码发送响应,我们将不得不查看该代码,以帮助您解决问题。
答案 2 :(得分:0)
只需返回return next();在您的中间件中,它将确保正常工作。