我有一个Firebase函数,我正在尝试使用第三方API。如果我的回答很简短,它会立刻回来,一切都会正常工作。然而,当我的回答太长时,它会分为两部分。这导致我的JSON解析失败。
import * as https from 'https';
export function search(searchTerm: string): Promise<IResponse> {
return new Promise<IResponse>((resolve, reject) => {
const options =
{
hostname: hostname,
port: port,
path: 'search?query=' + searchTerm,
method: 'GET',
headers:
{
'x-app-id': appID,
'x-app-key': appKey
}
};
const request = https.request(options, (response) => {
response.on('data', (data) => {
const json = data.toString('utf8');
//1. This prints out
//3. This prints out again (after the JSON parsing fails)
console.log(json);
//2. This fails "SyntaxError: Unexpected end of JSON input"
resolve(convertToResponse(json));
});
});
request.end();
});
}
我做错了什么?我该怎么修?
较大的响应将作为块发送。因此,你需要收集块,并在收到所有块后加入它们。当您接收到一个区块时,会调度"data"事件,而当您接收所有区块时,则会调度"end"事件。
nodejs文档中的一个简短示例
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});