繁体   English   中英

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

[英]Request does not return complete response. Error JSON.parse

我在 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();
  });
}

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

  • 当收到来自请求的大响应时, data事件被多次调用,每次都使用响应中的一块数据(不是完整的响应)。
  • 解析块时,尚未传输完整的 JSON 文档,因此解析失败并显示“Unexpected end of JSON stream”错误

简而言之,您需要:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM