请求未返回完整的响应。错误JSON.parse

时间:2018-12-28 12:47:47

标签: javascript node.js json request

我在nodejs中遇到问题,我使用https.request向api请求,响应包含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 :(得分:0)

正如我在评论中所怀疑的那样,您没有处理多个data事件。

  • 在收到来自请求的大响应时,将多次调用data事件,每次事件都包含响应中的大量数据(不是)。
  • li>
  • 解析大块时,尚未传输完整的JSON文档,因此解析失败,并显示“ JSON流意外结束”错误

简而言之,您需要:

  1. 创建变量以收集完整的正文
  2. data事件中,将新块附加到整个正文中
  3. 调用end事件时,解析整个正文。

这是一个简短的示例,取自official documentation

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
  });
});