ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту - PullRequest
0 голосов
/ 04 февраля 2020

это мой код маршрута в 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");
      });
    });

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Если вы 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(), тогда должен быть какой-то другой код (возможно, промежуточное программное обеспечение), который также отправляет ответ, и мы должны увидеть этот код, чтобы помочь вам разобраться с этим.

0 голосов
/ 05 февраля 2020
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. Он не должен ничего возвращать. Вам просто нужно сообщить функции, что после отправки ошибки ответа она должна завершить функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...