【问题标题】:ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the clientERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头
【发布时间】:2020-05-20 16:37:03
【问题描述】:

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

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

【问题讨论】:

  • 只需将res.status(500)..... 更改为return res.status(500).... 即可停止执行并从查询返回..

标签: mysql node.js express


【解决方案1】:

只需返回 return next();在你的中间件中,它肯定会工作。

【讨论】:

  • 只返回 next();
【解决方案2】:

如果你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() 错误的情况下会出现“无法设置标头后发送到客户端”错误,那么一定有其他地方的代码(可能是中间件)也在发送响应,我们必须查看该代码才能帮助您解决问题。

【讨论】:

    【解决方案3】:
    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 语句,它继续运行第二个。

    因此您可以通过 2 种方式解决您的错误。将res.send 放在else 块中或在res.status 之后放置一个return 关键字。它不必返回任何东西。您只需要向函数发出信号,在它发送响应错误后它应该终止函数。

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 2019-06-15
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2020-06-21
      • 2021-07-21
      • 1970-01-01
      相关资源
      最近更新 更多