Отправка внешнего HTTP-запроса в рамках экспресс-маршрута вызывает ошибку заголовков - PullRequest
0 голосов
/ 08 июля 2019

Я создаю API в NodeJS 12 и Express.

У меня есть маршрут API в приложении, которое вызывает URL внешнего API. Маршрут API должен отправлять ответ клиенту, когда данные ответа возвращаются с внешнего URL-адреса, и правильно обрабатывать ошибки.

Примечание: на SO уже есть похожие вопросы. Однако, как представляется, нет примеров с этим точным сценарием выполнения запроса API внутри маршрута, и поэтому я не смог решить эту проблему на основе этих ответов.

Я понимаю, что проблема может быть вызвана тем, что res.send () отправляет ответ клиенту, а затем делается другая попытка отправить ответ, возможно, из-за ошибки сервера.

Этот маршрут работает большую часть времени , однако иногда возникает ошибка Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client.

Экспресс-маршрут:

router.get('/requests/:id', (req, res, next) => {

  const id = req.params.id;

  const options = {
    hostname: process.env.HOSTNAME,
    port: process.env.PORT,
    path: `/example/api/${id}`,
    method: 'GET',
    headers: {
      'Content-Type': 'application/json'
    }
  };

  const request = https.request(options, (response) => {
    response.setEncoding('utf8');
    response.on('data', (data) => {
      console.log(`data: ${data}`);
      res.status(200).send(data);
    });
    response.on('end', () => {
      console.log('No more data in response.');
    });
  });

  request.on('error', (e) => {
    console.error(`API request failed ${e.message}`);
    res.status(500).send(`Server error`);
  });

  request.end();

});

Сообщение об ошибке:

_http_outgoing.js:455
throw new ERR_HTTP_HEADERS_SENT('set');
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:455:11)
at ServerResponse.header (/app/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/app/node_modules/express/lib/response.js:170:12)
at IncomingMessage.<anonymous> (/app/routes/api/aeon.js:37:23)
at IncomingMessage.emit (events.js:200:13)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:271:13)
at IncomingMessage.Readable.push (_stream_readable.js:210:10)
at HTTPParser.parserOnBody (_http_common.js:129:22)
at TLSSocket.socketOnData (_http_client.js:452:22)
at TLSSocket.emit (events.js:200:13)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:275:11)
at TLSSocket.Readable.push (_stream_readable.js:210:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:166:17)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...