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

使用async/await与fetch时的错误处理及写法合理性咨询

关于Fetch与Async/Await的错误处理及代码优化问题

第一个问题:是否必须使用try/catch或then/catch?

不是语法强制要求,但实际开发中强烈建议添加,原因有两点:

  1. 网络层面的错误(比如断网、域名无法解析)会导致fetch的Promise reject,如果没有错误处理,会触发未捕获的Promise拒绝警告,在Node.js环境甚至可能直接终止进程。
  2. fetch的特性是:即使返回HTTP错误状态码(比如404、500),Promise依然会resolve,只有response的ok属性会变为false。如果不手动检查response.ok并抛出错误,这类HTTP错误不会进入catch逻辑,你会误以为请求成功,但实际拿到的是错误数据。

另外你原代码有个小问题:response.json()前面没加await,这会让getData返回的是一个未解析的Promise,而不是最终的JSON数据,后续使用时会出问题。

第二个问题:修改后的写法是否简洁且可行?

这个写法既不简洁,也存在问题:

  1. 冗余代码:await getData().then((data) => data)完全没必要,await本身就是等待Promise resolve,直接写const result = await getData()即可,多出来的then纯粹是多余的。
  2. 潜在错误:getData里的response.json()依然没加await,所以result实际上是一个Promise对象,后续访问result.data.page.content.id时会直接报错,因为Promise对象上没有data属性。

优化后的正确写法

先修正getData函数,补上HTTP错误检查和await:

const getData = async () => {
  const response = await fetch(process.env.ENDPOINT, options);
  // 检查HTTP状态,手动抛出错误
  if (!response.ok) {
    throw new Error(`请求失败,状态码:${response.status}`);
  }
  const json = await response.json(); // 添加await解析JSON
  return json;
};

然后使用时简化逻辑:

try {
  const result = await getData();
  res.redirect(`/my-page/?id=${result.data.page.content.id}`);
} catch (err) {
  console.error(err);
}

这样既简洁,又能正确捕获网络错误和HTTP错误,同时保证拿到的是解析后的JSON数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:52:15