虽然已经在响应拦截器里做了一些全局处理,最后是通过 Promise.reject
抛出的异常
现在每个接口请求方法都还是得写 try/catch
或者 .catch()
真的好麻烦
有什么比较好的方案吗?
虽然已经在响应拦截器里做了一些全局处理,最后是通过 Promise.reject
抛出的异常
现在每个接口请求方法都还是得写 try/catch
或者 .catch()
真的好麻烦
有什么比较好的方案吗?
一般来说我会在响应拦截器中写一个 config.custom.catch
的判断,如果在请求接口时没有明确声明为 true
就使用 return new Promise(() => { })
返回一个 pending
中的 promise
只单纯做一下异常吐司处理。
如果请求的接口在 config
中声明了 custom.catch
为 true
时,则 return Promise.reject(err)
返回异常信息,就可以在具体的业务代码中 .catch
做异常处理了。
我会建议你只在具体的地方 try ... catch
,而不是只全局处理。因为每个地方发生错误之后,要展示给用户的错误信息、后续处理很可能是不一样的。全局除了会让你稍微少写一些代码外,并不能带来什么好处。
所以该写的地方就好好写,该省事的地方再省事。
这是个好问题。一般来说,有两种方式比较常用
httpRequest()
之类的函数,在函数中调用 axios 并进行默认的错误处理。如果考虑通用性,可以加一些配置参数来跳过或覆盖默认的错误处理一般接口报错,会在拦截器中统一处理,比如提示后台返回的错误。
如果用Promise.reject去抛出错误,那么业务接口必然要去捕获这个错误,否则浏览器会提示未捕获的错误。
不想每个接口都写 try catch,试试将 return Promise.reject(response.data) 改为 return response.data
我觉得没啥啊,Uncaught
是因为你的Axios
返回的Promise
报错了,没有处理的函数而已。
这种应该的 Waring
不会是 Error
才对。
要是每个请求都这样(不管返回值对不对),那是得考虑是不是你配置的Interceptor
代码里有问题了...
另外看报错提示,你这是Node Server端么?
首先,封装一个request.js 文件,创建一个axios 使用返回值拦截器抛出对应的信息
// 创建一个axios
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
timeout: 5000
})
// 设置返回值拦截器 并抛出 Promise
service.interceptors.response.use(
response => {
if(res.code !== 200){
return Promise.reject({message:res.message,err:new Error(res.message || 'Error')})
} else {
return res
}
}
error => {
return Promise.reject(error)
}
)
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决