Node.js使用node-fetch如何判断响应为JSON或Text格式避免解析报错
报错核心原因
res.json() 会消费响应的可读流,一旦解析失败触发catch,此时流已经被部分读取,再调用res.text()无法拿到完整的响应内容,所以会报错。
解决方案
提供两种可按需选择的实现:
方案1:通过响应头判断(推荐,性能更高)
如果对接的接口规范,优先通过Content-Type响应头判断格式,无额外性能开销:
const fetch = require("node-fetch"); const doFetch = async (url) => { try { const res = await fetch(url); const contentType = res.headers.get('content-type'); // 匹配json类型的响应头 if (contentType?.includes('application/json')) { return await res.json(); } // 其他场景统一返回文本 return await res.text(); } catch (error) { console.log('fetch error', error.message); } }
方案2:硬兜底解析(兼容不规范接口)
如果接口返回的Content-Type不符合规范,需要强制尝试解析的场景,先克隆响应流再试解析:
const fetch = require("node-fetch"); const doFetch = async (url) => { try { const res = await fetch(url); // 克隆响应流用于尝试json解析,不消耗原响应流 const resClone = res.clone(); try { return await resClone.json(); } catch (err) { // 解析失败用未消耗的原响应流读取文本 return await res.text(); } } catch (error) { console.log('fetch error', error.message); } }
内容的提问来源于stack exchange,提问作者cupremplus
相关产品推荐
相关产品推荐

