Ответ
A 204 No Content
не имеет никакого содержимого и, следовательно, не будет запускать события "data"
. Вместо этого вам следует прослушивать событие "end"
.
Более того, может быть более одного события "data"
, вызванного тем, что возвращаемые данные передаются в потоковом режиме. Каждый поток данных в виде потока должен быть объединен с другим чанки перед использованием - например, добавление каждого чанка в строку, файл или прохождение через конвейер данных.
Вот исправленный пример, основанный на документации http.get(...)
:
const req = http.request(options, (res) => {
console.log(`statusCode: ${res.statusCode}`);
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
if (!res.complete) {
// connection lost before complete response was received
response.status(500).send('The connection to the server was terminated while the command was still being sent.');
return;
}
if (res.statusCode < 200 || res.statusCode >= 300) {
// unexpected status code
response.status(500).send('Server responded unexpectedly.');
return;
}
if (rawData === '') {
// no body recieved
response.status(200).send(`Successfuly sent ${data} command and got a ${res.statusCode} response without a body`);
return;
}
// try to parse body as JSON
try {
const parsedData = JSON.parse(rawData);
console.log(`Server gave a ${res.statusCode} response. JSON body: `, parsedData);
response.status(200).send(`Successfuly sent ${data} command and got a ${res.statusCode} response with data: ${JSON.stringify(parsedData)}`);
} catch (error) {
// JSON parse error
console.error(`Failed to parse response body as JSON`, { statusCode: res.statusCode, error, rawData });
response.status(500).send(`Successfuly sent ${data} command and got a ${res.statusCode} response, but the response body could not be parsed as JSON.`);
}
});
});
Но поскольку @ Renaud предоставил в свой ответ , часто проще использовать стороннюю библиотеку запросов, которая обрабатывает данные за вас. Рекомендуется выбирать библиотеку, построенную на Promises, поскольку они хорошо работают в облачных функциях. Другая причина, по которой следует избегать использования базовых библиотек http
и https
, заключается в том, что обработка нескольких объектов, называемых req
/ request
и res
/ response
, может привести к путанице при просмотре кода.