无法从 Axios 获得正确的错误

Cannot get correct error from Axios

我有一个 doFetch 函数可以处理我所有的 api 调用:

const doFetch = function(params){
    ...
    // Make request using Axios. Axios is promise based.
    return axios({
        method: method,
        url: baseUrl + url,
        data: queryParams,
        timeout: timeout,
        headers: {
            'Content-Type': contentType,
            'Authorization': `bearer ${Auth.getToken()}` // set the authorization HTTP header
        },
        responseType: responseType
    }).then((response) => {
        if(typeof params.callback === "function"){
            params.callback(response);
        }
        else {
            return response;
        }
    }).catch((err) => {
        if(typeof params.error === "function") {
            if (err.response) {
                params.error(err.response.data);
            }
        }
        else{
            if (err.response) {
                return err.response.data;
            }
            else{
                return err;
            }
        }
    });
};

一个这样的 api 调用正在返回一个自定义错误,就像这样(快速服务器):

return res.status(400).json("There was an error on the server.");

调用doFetch的函数是saveUser:

saveUser(userObj).then((response) => {                
    console.log("No Error");
}).catch((error) => {
    console.log("Error:", error);
});

问题是我在终端中看到 No Error,而我本应只期待显示错误消息。有什么想法吗?

我喜欢 return 准确地承诺,以确保它 does/returns 我想要的。

我不喜欢依赖第 3 方的 "promise"-s。


所以我建议你将它包装在 promise 和 resolve/reject responses/errors 手动:

const doFetch = params => {
    ...
    // Make request using Axios. Axios is promise based.
    return new Promise((resolve, reject) => {
      axios({
        method: method,
        url: baseUrl + url,
        data: queryParams,
        timeout: timeout,
        headers: {
            'Content-Type': contentType,
            'Authorization': `Bearer ${Auth.getToken()}` // set the authorization HTTP header
        },
        responseType: responseType
      })
      .then((response) => {
        console.info('doFetch:', response); // for debug purposes

        if(typeof params.callback === "function"){
          params.callback(response);
        }
        resolve(response);
      })
      .catch((err) => {
        console.error('doFetch:', err); // for debug purposes

        const error = (err.response) ? err.response.data : err;

        if(typeof params.error === "function") {
          params.error(error);
        }
        reject(error);
      });
    };
};