Почему мой ответ приходит в нескольких сообщениях? Как я могу это исправить? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть функция 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();
    });
}

Что я делаю не так? Как я могу это исправить?

1 Ответ

1 голос
/ 03 апреля 2020

Большие ответы отправляются как куски. Таким образом, вам нужно собрать куски и присоединиться к ним после того, как вы все их получили. Событие '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.');
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...