如何在 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();
}
}
所以我有一个函数可以从我的 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();
}
}