使用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响应?
答案 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遇到403
或const 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;