Umi: [umi-request] 怎么处理业务异常?

Created on 20 Aug 2019  ·  7Comments  ·  Source: umijs/umi

情况描述

umi 安装的antd pro.
请求无网络错误, status为200的情况下.
后台返回的response里是操作未成功的这种业务错误怎么统一处理呢?

// 假设这是操作成功返回数据
{
  success: 1,
  data: {}
}

// 假设这是操作失败返回数据
{
  success: 0,
  message: '操作未成功'
}

因为如果返回success为0,就不需要在effect中调用yield put({})去设置state数据了.

尝试过的方案:

  • [可行]下面的代码在dva model的effect中请求拿到数据之后判断response里面的success状态,如果未成功则renturn不执行yield put({...})是可以的,但是如果每个接口都加会很麻烦.
effects: {
    *list({ payload }, { call, put }) {
      const res = yield call(list, payload);
      if (res.success === 0) return;
      yield put({
        type: 'changeListData',
        payload: res.data,
      });
    },
}
  • [不可行]下面的代码在utils/request.ts里中间件处理, 但是会有一个问题,就是在页面组件中的loading会一直为false,所以页面里面loading动画一直不取消.
// 中间件,对请求前、响应后做处理
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 ^1.0.8
  • Node v10.16.2
  • win10

Most helpful comment

很不好意思,目前我也是这样写的,umi-request 提供的中间件旨在为开发者提供请求前后的统一增强处理,例如当接口返回异常,做异常上报或做 UI 提示网络异常等,最终还是会把响应返回给真实业务场景,方便开发者根据不同场景去做更加业务化的处理。

好的,谢谢.
希望以后支持可选择统一处理或是在不同场景做业务化处理
像我这种情况应该也不少, 统一处理可以更加优雅.

All 7 comments

很不好意思,目前我也是这样写的,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

希望有更优雅的统一异常处理的案例

Was this page helpful?
0 / 5 - 0 ratings

Related issues

ddzy picture ddzy  ·  3Comments

afc163 picture afc163  ·  3Comments

six-666 picture six-666  ·  3Comments

zemzheng picture zemzheng  ·  3Comments

tauruswang picture tauruswang  ·  3Comments