Я создаю 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)