如何获得axios错误响应并进入redux saga catch方法

时间:2019-01-14 17:00:39

标签: axios redux-saga

使用axios的代码是:

export const createBlaBla = (payload) => {
  return axios.post('/some-url', payload)
    .then(response => response)
    .catch(err => err);
}

然后我将其与redux-saga一起使用,如下所示:

function* createBlaBlaFlow(action) {
  try {
    const response = yield call(createBlaBla, action.payload);
    if (response) {
      yield put({
        type: CREATE_BLA_BLA_SUCCESS
      });
    }
  } catch (err) {
    // I need the error data here ..
    yield put({
      type: CREATE_BLA_BLA_FAILURE,
      payload: 'failed to create bla-bla'
    });
  }
}

万一后端发生错误(例如,无效数据发送到后端),它会返回400响应,其中包含一些数据:

{
  "code":"ERR-1000",
  "message":"Validation failed because ..."
  "method":"POST",
  "errorDetails":"..."
}

但是我在传奇中的catch语句中没有收到这些有用的数据。我可以在axios catch语句中使用console.log()数据,也可以在传奇中的try语句中获取数据,但是它永远不会到达catch中。

可能我需要做其他事情吗? ...还是服务器在这种情况下不应该返回400响应?

2 个答案:

答案 0 :(得分:1)

因此,我想出了两个解决此问题的方法。

===

第一个-非常转储的解决方法,但实际上在某些特定情况下它会很方便。

在故事中,就在我们内部调用axios调用函数之前,我们有一个错误变量和一个设置该变量的回调:

let errorResponseData = {};
const errorCallback = (usefulErrorData) => {
    errorResponseData = usefulErrorData;
};

然后-在axios方法中,我们这样:

export const createBlaBla = (payload, errCallback) => {
    return axios.post('/some-url', payload)
        .then(response => response)
        .catch(err => {
            if (err && err.response.data && typeof errCallback === 'function') {
                errCallback(err.response.data);
            }
            return err;
        });
}

这样,当我们发出请求并且后端返回错误时-我们将调用回调并将在此处提供来自后端的错误。这样-在传奇中-我们在变量中存在错误,可以根据需要使用它。

===

但是,另一个论坛提供了另一个解决方案。

我遇到的问题是因为在使用axios调用的方法中,我有catch,这意味着错误不会在生成器中冒泡。所以-如果我们使用axios调用修改方法,如下所示:

export const createBlaBla = (payload) => {
  return axios.post('/some-url', payload)
}

然后在传奇中的catch语句中,我们将看到实际的后端错误。

希望这对其他人有帮助:)

答案 1 :(得分:0)

在您的API调用中,您可以执行以下操作:

validateStatus()

请注意200部分-这样,当axios遇到403const response = yield call(someAPICall, action); if (response.status === 200) { // Proceed further } else if (response.status === 403) { // Inform user about error } else { ... } 响应时,它不会引发错误,并且您可以在之后处理响应

$phpExcelObject = $this->get('phpexcel')->createPHPExcelObject($filePath);
$activeSheet = $phpExcelObject->getActiveSheet()->rangeToArray('B1:G1');


dump($activeSheet);die;