Запрос не возвращает полный ответ.Ошибка JSON.parse - PullRequest
0 голосов
/ 28 декабря 2018

У меня проблема с nodejs, я делаю запрос к API, используя https.request, ответ содержит объект из 10000 строк.Что происходит, так это то, что весь объект не прибывает, и синтаксический анализ выдает ошибку: Unexpected end of JSON input;

Может кто-то помочь?

Функция для запроса:

function request({
  options,
  method,
  resource,
  queryParams,
  bodyParams,
}) {
  return new Promise((resolve, reject) => {
    const hasBodyParams = !!bodyParams;

    const stringifyedQueryParams = strigifyQueryParams(queryParams);

    const optionsRequest = {
      ...options,
      method,
      path: `${resource}${stringifyedQueryParams}`,
    };

    const req = https.request(optionsRequest, (res) => {
      res.setEncoding(configs.ENCODING);
      res.on(events.DATA, data => resolve({
        body: JSON.parse(data),
        statusCode: res.statusCode,
      }));
    });

    req.on(events.ERROR, error => reject(error) );
    hasBodyParams && req.write(bodyParams);
    req.end();
  });
}

1 Ответ

0 голосов
/ 28 декабря 2018

Как я и подозревал в комментариях, вы не обрабатываете несколько data -эвентов.

  • При получении больших ответов на запрос data -эвент вызывается несколько раз,каждый раз с фрагментом данных из ответа ( не полный ответ).
  • Когда вы анализируете фрагмент, полный документ JSON еще не был передан, поэтомусинтаксический анализ завершается с ошибкой «Неожиданный конец потока JSON»

Короче говоря, вам необходимо:

  1. Создать переменную для сбора всего тела
  2. В случае data добавьте новый фрагмент к полному телу
  3. Когда вызывается событие end, выполните синтаксический анализ всего тела.

Воткраткий пример, взятый из официальной документации :

https.request(options, (res) => {
  // PARTIAL example
  res.setEncoding("utf8"); // makes sure that "chunk" is a string.
  let fullBody = "";

  res.on("data", data => {
    fullBody += data;
  });
  res.on("end", () => {
    const json = JSON.parse(fullBody);
    // work with json
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...