ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头

时间:2020-02-04 19:30:13

标签: mysql node.js express

这是我的特快航线代码。 当我尝试删除或张贴在邮递员中时,在控制台中出现此错误

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");
      });
    });

3 个答案:

答案 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/elsereturn才能停止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();在您的中间件中,它将确保正常工作。