我对js中的Promise相对较为陌生,对于以下代码块中的问题感到困惑:当服务器返回401未授权时,为什么我的catch函数没有运行?
loginUser(email, password).then((token) => {
console.log("in then")
//ipcRenderer.send('login-success', token)
}).catch(err => {
console.log("in catch") //not running
})
loginUser函数:
function loginUser(email, password) {
let body = { email: email, password: password }
return fetch('http://localhost:3000/api/v1/sessions', {
method: 'POST',
body: JSON.stringify(body),
headers: { 'Content-Type': 'application/json' }
}).then(response => {
return response.json().then(json => {
console.log(response.ok) // false
return response.ok ? json : Promise.reject(json)
}).catch(err => {
console.error(err)
})
})
}
任何帮助都将不胜感激。谢谢。
then
语句吗?在控制台和网络选项卡中看到了什么? - timothyclifford.catch(err => {console.error(err)})
的作用是将一个 rejected promise 转换成 resolved promise,这意味着你永远不会返回一个 rejected promise。如果你想像这样记录日志,那么你需要在.catch()
处理程序中添加throw err
以重新抛出错误并保持 promise 被拒绝的状态。此外,401 状态仍然是一个成功的 HTTP 请求。服务器被联系并返回了响应。它并没有被拒绝。因此,你需要在.then()
处理程序中检查状态,或者明确将非 2xxx 响应更改为一个拒绝。 - jfriend00