Node.js运行测试脚本报fetch is not defined且不使用node-fetch如何解决
问题根源
该未处理Promise拒绝报错,核心原因是await关键字会将Promise的reject状态转为抛出异常,但代码未对这段可能抛出异常的逻辑做错误捕获:
fetch请求本身失败(比如网络异常、地址非法、跨域拦截)时,返回的Promise会变为reject状态- 响应内容非JSON格式时,
response.json()解析也会抛出异常 - 上述两种异常未用
try/catch包裹捕获,或是调用包含这段代码的async函数时未追加.catch处理,就会触发对应警告。
解决方法
推荐直接用try/catch包裹async/await语法的请求逻辑,这是该语法下最标准的错误处理方案,不需要引入node-fetch也不需要改回.then链式调用:
// 注意:await 必须放在 async 修饰的函数内部 async function requestData() { try { const response = await fetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json' }, }); // 补充:fetch默认只有网络错误才会reject,4xx/5xx状态码不会自动抛错,需要手动判断响应状态 if (!response.ok) { throw new Error(`请求异常,状态码:${response.status}`); } const json = await response.json(); // 此处写请求成功后的业务逻辑 return json; } catch (err) { // 此处统一捕获所有错误:网络错误、状态码异常、JSON解析失败都会进入这个分支 console.error('请求处理失败,错误信息:', err); // 可按需选择:抛出错误给上层处理 / 返回默认值兜底 // throw err // return {} } } // 调用async函数时也需要做错误捕获,避免未处理的Promise拒绝 requestData().catch(err => { console.error('调用请求函数出错:', err) }) // 如果你是在其他async函数中调用requestData,也可以继续用try/catch包裹await语句
之前用.then/.catch无效的原因
await语法的作用就是等待Promise执行结束,直接返回resolve的结果,和.then链式调用是两套不同的异步写法,混用的情况下.catch无法捕获到await抛出的异常,统一用try/catch处理即可。
内容的提问来源于stack exchange,提问作者evelyn
相关产品推荐
相关产品推荐

