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

Node.js运行测试脚本报fetch is not defined且不使用node-fetch如何解决

问题根源

该未处理Promise拒绝报错,核心原因是await关键字会将Promise的reject状态转为抛出异常,但代码未对这段可能抛出异常的逻辑做错误捕获:

  1. fetch请求本身失败(比如网络异常、地址非法、跨域拦截)时,返回的Promise会变为reject状态
  2. 响应内容非JSON格式时,response.json()解析也会抛出异常
  3. 上述两种异常未用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:48:00