umi 安装的antd pro.
请求无网络错误, status为200的情况下.
后台返回的response里是操作未成功的这种业务错误怎么统一处理呢?
// 假设这是操作成功返回数据
{
success: 1,
data: {}
}
// 假设这是操作失败返回数据
{
success: 0,
message: '操作未成功'
}
因为如果返回success为0,就不需要在effect中调用yield put({})去设置state数据了.
尝试过的方案:
effects: {
*list({ payload }, { call, put }) {
const res = yield call(list, payload);
if (res.success === 0) return;
yield put({
type: 'changeListData',
payload: res.data,
});
},
}
// 中间件,对请求前、响应后做处理
request.use(async (ctx, next) => {
const { req } = ctx;
const { url, options } = req;
// 添加前缀
ctx.req.url = `/api/${url}`;
ctx.req.options = {
...options,
method: 'POST',
} as any;
await next();
const { res } = ctx;
const { success } = res;
if (success === '0') {
// 处理业务错误
message.warning(res.message);
return new Promise(() => {});
}
})
找了比较长时间不知道怎么处理比较好,所以来提个Issue,望大佬相助 thx
很不好意思,目前我也是这样写的,umi-request 提供的中间件旨在为开发者提供请求前后的统一增强处理,例如当接口返回异常,做异常上报或做 UI 提示网络异常等,最终还是会把响应返回给真实业务场景,方便开发者根据不同场景去做更加业务化的处理。
很不好意思,目前我也是这样写的,umi-request 提供的中间件旨在为开发者提供请求前后的统一增强处理,例如当接口返回异常,做异常上报或做 UI 提示网络异常等,最终还是会把响应返回给真实业务场景,方便开发者根据不同场景去做更加业务化的处理。
好的,谢谢.
希望以后支持可选择统一处理或是在不同场景做业务化处理
像我这种情况应该也不少, 统一处理可以更加优雅.
默默+1
在interceptor里面加的throw Error,行为是把response变成了{},但仍然视为正常返回
默默+1
业务增加了大量if···开始怀念promise的catch了
默默+1
加了errorHandler后,throw error出来后,effects里的loading一直恢复不了
默默+1
加了errorHandler后,throw error出来后,effects里的loading一直恢复不了
或许你可以试试在effects加个try catch,我是直接选择在errorHandler里面返回一个null
希望有更优雅的统一异常处理的案例
Most helpful comment
好的,谢谢.
希望以后支持可选择
统一处理或是在不同场景做业务化处理像我这种情况应该也不少, 统一处理可以更加优雅.