Axios 처리 오류
악시오스와의 Javascript 약속을 더 잘 이해하려고 합니다.내가 가장하는 것은 Request.js의 모든 오류를 처리하고 요청 함수를 사용할 필요 없이 어디서든 호출하는 것입니다.catch()
.
이 예에서는 요구에 대한 응답은 400 이며 JSON 에 오류 메시지가 표시됩니다.
다음과 같은 오류가 발생합니다.
Uncaught (in promise) Error: Request failed with status code 400
제가 찾은 유일한 해결책은.catch(() => {})
Somewhere.js. 하지만 난 그렇게 하지 않으려고 노력중이야.가능합니까?
코드는 다음과 같습니다.
Request.js
export function request(method, uri, body, headers) {
let config = {
method: method.toLowerCase(),
url: uri,
baseURL: API_URL,
headers: { 'Authorization': 'Bearer ' + getToken() },
validateStatus: function (status) {
return status >= 200 && status < 400
}
}
...
return axios(config).then(
function (response) {
return response.data
}
).catch(
function (error) {
console.log('Show error notification!')
return Promise.reject(error)
}
)
}
Somewhere.js
export default class Somewhere extends React.Component {
...
callSomeRequest() {
request('DELETE', '/some/request').then(
() => {
console.log('Request successful!')
}
)
}
...
}
사실, 지금으로서는 공리로는 가능하지 않습니다.다음 범위에 해당하는 상태 코드2xx
만, 에 걸릴 수 있습니다..then()
.
기존의 접근법은, 다음의 에러를 검출하는 것입니다.catch()
블록은 다음과 같습니다.
axios.get('/api/xyz/abcd')
.catch(function (error) {
if (error.response) {
// Request made and server responded
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else if (error.request) {
// The request was made but no response was received
console.log(error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
});
또 다른 접근법은 요청 또는 응답이 처리되기 전에 대행 수신하거나 캐치하는 것입니다.
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});
에러 본문 전체에 액세스 하려면 , 다음과 같이 실시합니다.
async function login(reqBody) {
try {
let res = await Axios({
method: 'post',
url: 'https://myApi.com/path/to/endpoint',
data: reqBody
});
let data = res.data;
return data;
} catch (error) {
console.log(error.response); // this is the main part. Use the response property from the error object
return error.response;
}
}
다음과 같이 할 수 있습니다.error.response.data
내 경우 백엔드에서 오류 속성을 받았습니다.그래서 error.response.data.error를 사용했습니다.
내 코드:
axios
.get(`${API_BASE_URL}/students`)
.then(response => {
return response.data
})
.then(data => {
console.log(data)
})
.catch(error => {
console.log(error.response.data.error)
})
비동기 기능을 사용하지 않으려면 대기하십시오.
export const post = async ( link,data ) => {
const option = {
method: 'post',
url: `${URL}${link}`,
validateStatus: function (status) {
return status >= 200 && status < 300; // default
},
data
};
try {
const response = await axios(option);
} catch (error) {
const { response } = error;
const { request, ...errorObject } = response; // take everything but 'request'
console.log(errorObject);
}
를 사용해 보았습니다.try{}catch{}
방법이 통하지 않았습니다.하지만, 사용법을 바꾸자.then(...).catch(...)
Axios Error가 올바르게 검출되어 가지고 놀 수 있습니다.브레이크포인트를 넣을 때 AxiosError를 볼 수 없고, 대신 검출된 에러는 정의되어 있지 않다고 표시되며, 이것이 UI에 표시됩니다.
왜 이런 일이 일어나는지 잘 모르겠다. 나는 그것이 매우 하찮다고 생각한다.어느 쪽이든 이 때문에, 저는 기존의 방식을 사용하는 것을 추천합니다..then(...).catch(...)
사용자에게 정의되지 않은 오류가 발생하는 것을 방지하기 위해 위에서 설명한 메서드를 사용합니다.
내가 제대로 이해했다면 네가 원하는 것then
요청이 성공하고 오류를 무시하려는 경우에만 호출되는 요청 함수입니다.이를 위해 새 약속을 만들려면 Axios 요청이 성공했을 때 해결하고 실패 시 이를 거부하지 않습니다.
업데이트된 코드는 다음과 같습니다.
export function request(method, uri, body, headers) {
let config = {
method: method.toLowerCase(),
url: uri,
baseURL: API_URL,
headers: { 'Authorization': 'Bearer ' + getToken() },
validateStatus: function (status) {
return status >= 200 && status < 400
}
}
return new Promise(function(resolve, reject) {
axios(config).then(
function (response) {
resolve(response.data)
}
).catch(
function (error) {
console.log('Show error notification!')
}
)
});
}
재사용 가능:
create errorHandler.js:
export const errorHandler = (error) => {
const { request, response } = error;
if (response) {
const { message } = response.data;
const status = response.status;
return {
message,
status,
};
} else if (request) {
//request sent but no response received
return {
message: "server time out",
status: 503,
};
} else {
// Something happened in setting up the request that triggered an Error
return { message: "opps! something went wrong while setting up request" };
}
};
다음으로, Axi의 에러를 검출할 때마다, 다음과 같이 합니다.
Just import error handler from errorHandler.js and use like this.
try {
//your API calls
} catch (error) {
const { message: errorMessage } = errorHandlerForAction(error);
//grab message
}
https://stackabuse.com/handling-errors-with-axios/
let res = await axios.get('/my-api-route');
// Work with the response...
} catch (err) {
if (err.response) {
// The client was given an error response (5xx, 4xx)
} else if (err.request) {
// The client never received a response, and the request was never left
} else {
// Anything else
}
}
try {
let res = await axios.get('/my-api-route');
// Work with the response...
} catch (err) {
if (err.response) {
// The client was given an error response (5xx, 4xx)
} else if (err.request) {
// The client never received a response, and the request was never left
console.log(err.request);
} else {
// Anything else
}
}
캐치를 사용하지 않고 어디서든 요청 기능을 호출할 수 있습니다.
첫째, 대부분의 오류를 한 곳에서 처리하는 것은 좋은 아이디어이지만, 요청을 처리하는 것은 쉽지 않습니다.일부 오류(예: "사용자 이름 사용" 또는 "잘못된 이메일" 등 400개의 유효성 검사 오류)는 전달되어야 합니다.
이제 Promise 기반 기능을 사용합니다.
const baseRequest = async (method: string, url: string, data: ?{}) =>
new Promise<{ data: any }>((resolve, reject) => {
const requestConfig: any = {
method,
data,
timeout: 10000,
url,
headers: {},
};
try {
const response = await axios(requestConfig);
// Request Succeeded!
resolve(response);
} catch (error) {
// Request Failed!
if (error.response) {
// Request made and server responded
reject(response);
} else if (error.request) {
// The request was made but no response was received
reject(response);
} else {
// Something happened in setting up the request that triggered an Error
reject(response);
}
}
};
그런 다음 다음과 같은 요청을 사용할 수 있습니다.
try {
response = await baseRequest('GET', 'https://myApi.com/path/to/endpoint')
} catch (error) {
// either handle errors or don't
}
나에게 효과가 있었던 스트림으로 설정된 응답 유형에 대한 공리 오류를 처리하는 한 가지 방법입니다.
.....
.....
try{
.....
.....
// make request with responseType: 'stream'
const url = "your url";
const response = axios.get(url, { responseType: "stream" });
// If everything OK, pipe to a file or whatever you intended to do
// with the response stream
.....
.....
} catch(err){
// Verify it's axios error
if(axios.isAxios(err)){
let errorString = "";
const streamError = await new Promise((resolve, reject) => {
err.response.data
.on("data", (chunk) => {
errorString += chunk;
}
.on("end", () => {
resolve(errorString);
}
});
// your stream error is stored at variable streamError.
// If your string is JSON string, then parse it like this
const jsonStreamError = JSON.parse(streamError as string);
console.log({ jsonStreamError })
// or do what you usually do with your error message
.....
.....
}
.....
.....
}
Promise catch 메서드에서 API 오류를 처리합니다.
let url = ``
axios.get(url)
.then((response) => {
// Success
})
.catch((error) => {
// Error
if (error.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
// console.log(error.response.data);
// console.log(error.response.status);
// console.log(error.response.headers);
} else if (error.request) {
// The request was made but no response was received
// `error.request` is an instance of XMLHttpRequest in the
// browser and an instance of
// http.ClientRequest in node.js
console.log(error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
console.log(error.config);
});
언급URL : https://stackoverflow.com/questions/49967779/axios-handling-errors
'programing' 카테고리의 다른 글
mysql, percona, maria 중 어느 것을 결정하다DB (0) | 2023.01.19 |
---|---|
LEFT JOIN을 사용하여 MySQL의 여러 테이블 업데이트 (0) | 2023.01.19 |
Vue 구성 요소가 다른 구성 요소를 확장하는지 확인합니다. (0) | 2023.01.19 |
지시어를 정의할 때 '컨트롤러', '링크' 및 '컴파일' 함수의 차이 (0) | 2023.01.19 |
Python의 time.time()은 로컬 타임스탬프 또는 UTC 타임스탬프를 반환합니까? (0) | 2023.01.19 |