You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS调用MovieDB API多次请求后JSON解析报错问题

问题分析与解决

核心问题

你直接给JSON.parse()传了Buffer数组chunk,这是错误的。

  • 当API返回数据量小的时候,data事件可能只触发一次,chunk里只有一个Buffer,此时JSON.parse(chunk)等价于JSON.parse(chunk[0]),刚好能解析成功;
  • 但多次请求后(或者数据量变大时),data事件会触发多次,chunk变成多个Buffer的数组,直接parse数组会把每个Buffer转成{"type":"Buffer","data":[...]}这样的对象,拼起来就是不合法的JSON,自然抛出语法错误。

你用JSON.stringify(chunk)再解析能“正常”,只是因为把Buffer数组转成了包含Buffer对象的JSON字符串,并不是API返回的原始数据,这是歪打正着,不是正确解法。

正确代码修正

应该把Buffer数组拼接成一个完整的Buffer,再转换成字符串后解析:

router.get("/", (req, res, next) => {
  let request = http.request(nowPlayingUrl, (response) => {
    let chunk = [];
    response.on("data", (data) => {
      chunk.push(data);
    });
    response.on("end", () => {
      // 拼接Buffer数组,转成字符串
      let rawData = Buffer.concat(chunk).toString();
      try {
        let result = JSON.parse(rawData);
        console.log(result);
        // 把解析后的数据传给模板渲染
        res.render("index.ejs", { data: result });
      } catch (err) {
        // 捕获解析错误,避免程序崩溃
        console.error("JSON解析错误:", err);
        next(err);
      }
    });
  });
  // 监听请求错误,处理网络异常
  request.on("error", (err) => {
    console.error("请求API失败:", err);
    next(err);
  });
  request.end();
});

额外优化点

  1. 用try/catch包裹JSON解析,即使API返回非JSON格式数据,也不会直接导致程序崩溃;
  2. 给请求对象添加error事件监听,处理DNS解析失败、连接超时等网络层面的错误;
  3. 修正了原代码中res.render在API请求完成前就执行的问题,确保模板能拿到正确的接口数据。

内容的提问来源于stack exchange,提问作者Baba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:52:10