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(); });
额外优化点
- 用
try/catch包裹JSON解析,即使API返回非JSON格式数据,也不会直接导致程序崩溃; - 给请求对象添加
error事件监听,处理DNS解析失败、连接超时等网络层面的错误; - 修正了原代码中
res.render在API请求完成前就执行的问题,确保模板能拿到正确的接口数据。
内容的提问来源于stack exchange,提问作者Baba
相关产品推荐
相关产品推荐

