如何在 javascript 中使用 async await 捕获服务器错误?

How can i catch a server error with async await in javascript?

所以我有一个函数可以从我的 API 中获取数据。我对请求设置了限制,当达到限制时,服务器 returns 500 响应。在本地开发中进行测试时,捕获到错误并触发弹出窗口的 showLimitReachedAlert 函数。当 运行 设置 docker (+ nginx) 时,不会触发弹出功能。

如何修改此函数以捕获 500 响应并触发该函数?

function searchByKeyword() {
  for (let x in networks) {
    let urlParameter = x;
    let network = networks[x];

    async function SearchKeywordForNetwork() {
      let url = `${base}/articles/${urlParameter}/${startDate.value}/${endDate.value}/${searchKeyword.value}`;
      const response = await fetch(url);
      const json = await response.json();
      network.value = json;
    }

    SearchKeywordForNetwork().catch(showLimitReachedAlert);
  }
}

首先,如果要捕获错误,您需要实际抛出错误。 另外请注意,如果响应具有 500 状态代码,fetch() 不会抛出任何错误。要实现你想要的,你需要检查响应,如果你有 500,则抛出错误,然后捕获错误。这是一个例子:

function searchByKeyword() {
  for (let x in networks) {
    let urlParameter = x;
    let network = networks[x];

    async function SearchKeywordForNetwork() {
      let url = `${base}/articles/${urlParameter}/${startDate.value}/${endDate.value}/${searchKeyword.value}`;
      const response = await fetch(url);
      if (response.status == 500) 
        throw new Error("Got a 500 status code");
      const json = await response.json();
      network.value = json;
    }

    try {
      await SearchKeywordForNetwork()
    } catch (error) {
      showLimitReachedAlert();
    }
  }
}

我唯一要补充的是:如果出现网络故障,fetch 会抛出错误。抛出自定义错误并在 catch 语句中检查错误类型可能很方便。否则,您将在这两种情况下调用 showLimitReachedAlert。

想出了如何做到这一点。在 Docker 和本地版本中都进行了测试。

function getMostRecentNews() {
  for (let x in networks) {
    let urlParameter = x;
    let network = networks[x];

    async function getToday() {
      let url = `${base}/articles/${urlParameter}`;

      fetch(url)
        .then(async (response) => {
          const json = await response.json();
          network.value = json;

          // check for error response
          if (!response.ok) {
            // const error = (json && json.message) || json.statusText;
            return Promise.reject(error);
          }
        })
        .catch((error) => {
          showLimitReachedAlert();
        });
    }

    getToday();
  }
}