【发布时间】:2021-06-25 00:49:15
【问题描述】:
我正在为fetch 编写一个简单的包装器。
async function apiCall(
endpoint: string,
{
data,
headers: customHeaders,
...customConfig
}: { data?: Object; headers?: Object } = {}
) {
const config = {
method: data ? 'POST' : 'GET',
body: data ? JSON.stringify(data) : undefined,
headers: {
'content-type': data ? 'application/json' : undefined,
...customHeaders,
},
...customConfig,
}
return fetch(endpoint, config as any).then(async (response) => {
if (response.ok) {
const json = await response.json() // ????
return json
} else {
// ???? ???? what if `response` contains error messages in json format?
return Promise.reject(new Error('Unknown Error'))
}
})
}
它工作正常。问题在于这个 sn-p
return fetch(endpoint, config as any).then(async (response) => {
if (response.ok) {
const json = await response.json()
return json
} else {
// ???? ???? what if `response` contains error messages in json format?
return Promise.reject(new Error('Unknown Error'))
}
})
如果响应不正确,它会使用通用Error 拒绝。这是因为默认情况下,window.fetch 只会在实际网络请求失败时拒绝承诺。但问题是,即使response 不正常,它仍然可能会出现json 格式的错误消息。这取决于后端实现细节,但有时您可以通过response.json() 在响应正文中获取错误消息。现在这个用例没有包含在我构建的包装器中。
所以我想知道我将如何解释这一点?我想你可以做类似的事情
fetch(endpoint, config as any).then(async (response) => {
if (response.ok) {
const json = await response.json()
return json
} else {
try {
const json = await response.json()
return Promise.reject(json)
} catch {
return Promise.reject(new Error('Unknown Error'))
}
}
})
但我想知道是否有更优雅的方法可以做到这一点?
最后,我非常了解 Axios 之类的库。我建造这个部分是为了满足我的求知欲。
顺便说一句,一个稍微不相关的问题,但我想知道这两个是否等价
if (response.ok) {
const json = await response.json()
return json
}
if (response.ok) {
return response.json()
}
有人将我的问题标记为与this question 重复。事实上,它们并不相同。我没有做出与该问题相同的假设,即 API 调用在成功和失败时都返回 JSON 数据。我的问题是关于在我们不能做出这样的假设的情况下我们应该怎么做。
【问题讨论】:
-
这能回答你的问题吗? fetch: Reject promise with JSON error object
-
@FredStark 不,它没有。链接指向的问题假设我请求总是在成功和失败时返回 JSON 数据。我的问题没有那个假设,实际上它是在问我们在无法做出假设的情况下应该如何做。请恢复您的投票以结束我的问题。
-
哦,我可能错过了这个案例,但您根本无法控制后端? JSON 不是发送错误消息的唯一方式,您是否愿意同时处理原始文本消息或 HTML 错误页面?
-
@Joji 啊,好吧,我知道它有什么不同。投票被撤回。看起来你现在也得到了一半体面的答案:)
标签: javascript json http