์ฌ์ฉ์์๊ฒ ์ ์ ํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์๋๋ก ์๋ฒ๊ฐ ๋ค์ด๋ ์๊ฐ์ ๊ฐ์งํ๋ ค๊ณ ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ axios ๋คํธ์ํฌ ์์ฒญ์ https://github.com/mzabriskie/axios/issues/204์์ ๋ ผ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ๋ชจ๋ axios ์ค๋ฅ์ ๋ค๋ฅธ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋ด ์ฝ๋์์ ์ด ์ค๋ฅ๋ฅผ ๊ฐ์งํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ err.message๋ฅผ ํ์ธํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
if (err.message === "Network Error"){/*tell user the server is down*/}
๋ฌธ์์ด ๋น๊ต๊ฐ ์ฝ๊ฐ ์ํํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋๋ฅผ ๊ท์ฐฎ๊ฒํฉ๋๋ค. ์๋ง๋ ์ธ์ ๊ฐ ์ด ๋ฉ์์ง๊ฐ ๋ฒ์ญ๋์ด ๋ด ์ฝ๋๊ฐ ์คํจํ ๊ฒ์ ๋๋ค.
err.status ๋๋ err.code(๋๋ err.???)๊ฐ ์ฝ๋์์ ํ์ธํ ์ ์๋ ๋ฌธ์ํ๋ ๊ฐ์ผ๋ก ์ค์ ๋๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ๋๋ฝ๋ ์ด ์๋๋ฆฌ์ค๋ฅผ ๊ฐ์งํ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ชจ๋ ๊ฐ์ฌํฉ๋๋ค!
๋ด ์๊ฐ ์ ๋น์ ์ด ๋ง๋ค. ์ํ ์ฝ๋๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
#204์์ ๋๊ตฐ๊ฐ๊ฐ ๋งํ๋ฏ์ด ๋ธ๋ผ์ฐ์ ์์ ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ์ก์ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ด์ Axios๋ ์ผ๋ฐ ์ค๋ฅ( new Error('Network error')
)๋ก ์๋ตํฉ๋๋ค. ์๋ชป๋ ์๋ต(์ํ ์ฝ๋ !== 2xx ๋๋ ์ฌ์ฉ์ ์ง์ ๊ฒ์ฌ)๊ณผ ๊ตฌ๋ณํ๋ ค๋ฉด ์ค๋ฅ ๋ฉ์์ง ๋์ status
์์ฑ์ ํ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์:
axios.request(options).catch(function(error) {
if (!error.status) {
// network error
}
});
์ฌ์ฉ์ ์ง์ ์ํ ์ฝ๋๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์ข์ง ์์ ์๊ฐ์ด๊ณ (๋ ๋ง์ ํผ๋์ ์ผ์ผํฌ ์ ์์) ํน์ ์์ฑ์ ์ค์ ํ๋ ๊ฒ์ ๋จ์ผ ์ค๋ฅ ์ฌ๋ก๋ง ์๊ธฐ ๋๋ฌธ์ ์ ํ ๋์์ด ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก Node.js์์๋ ์ค์ ์ค๋ฅ์ ์ก์ธ์คํ ์ ์๊ณ Node.js ๋ฌธ์์ ๋ฐ๋ผ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ฝ์ต๋๋ค.
์, ๊ทธ๋์ Axios ํธ์ถ์ ์ํด ๋์ ธ์ง ๋ชจ๋ ์ค๋ฅ๋ 1) ์ํ๊ฐ ์๊ฑฐ๋ 2) ์ผ๋ฐ์ ์ธ ๋คํธ์ํฌ ์ค๋ฅ๋ก ๋ณด์ฅ๋ฉ๋๊น? ์ถฉ๋ถํ ์ข์ ๊ฒ ๊ฐ์์.
์ง๊ธ๊น์ง 404,500๊ณผ ๊ฐ์ ์ค๋ฅ ์ฝ๋๋ฅผ ์ป์ ์ ์์ต๋๋ค.. ์ฌ์ ํ ๋คํธ์ํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
instance.post('/foo', {์์ฒญ ID : 12345})
.then(ํจ์(์๋ต) {})
.catch(ํจ์(์ค๋ฅ){
console.log(์ค๋ฅ); // ๋คํธ์ํฌ ์ค๋ฅ
console.log(error.status); // ์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
console.log(์ค๋ฅ.์ฝ๋); // ์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
});
๋คํธ์ํฌ ์ค๋ฅ๋ Axios๊ฐ ์๋ฒ์ ์ ํ ์ฐ๊ฒฐํ ์ ์์ผ๋ฏ๋ก ์๋ฒ์์ ์ค๋ฅ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋ค๋ฅธ ๋๊ตฌ(curl, postman ๋๋ ๋ธ๋ผ์ฐ์ )๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐํ ์ ์๋์ง ํ์ธํ์๊ฒ ์ต๋๊น?
๋ด ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ค์ ๋ก 404 ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๊ณ ์ผ๋ถ ๋ค๋ฅธ API ํธ์ถ๊ณผ ํจ๊ป ์๋ฒ๊ฐ 500 ๋ด๋ถ ์๋ฒ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง๋ง ์ฌ์ ํ ์คํฌ๋ฆฝํ ์ ํตํด ๋คํธ์ํฌ ์ค๋ฅ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค(์ฆ, console.log( error.status); // ์ ์๋์ง ์์).
error.response.status
์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋ฌด๋ ๋๋ฅผ ๋์์ค ์ ์์ต๋๊น?
์๋ฒ ์๋ต์ 401์ด์ง๋ง axios๋ ๋ค์์ ์ ๊ณตํฉ๋๋ค.
์ค๋ฅ --> "๋คํธ์ํฌ ์ค๋ฅ"
error.response --> ์ ์๋์ง ์์
error.status --> ์ ์๋์ง ์์
์ค๋ฅ๊ฐ "๋คํธ์ํฌ ์ค๋ฅ"์ธ ๊ฒฝ์ฐ Axios๊ฐ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์๊ฑฐ๋ ์ด๋ค ์ด์ ๋ก ์๋ฒ์์ ์๋ต์ ๋ฐ์ง ๋ชปํจ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ 401 ์ค๋ฅ๋ Axios์ ๋ฐ์ํ์ง ์์ต๋๋ค. StackOverflow์ ๋ช ๊ฐ์ง ์ํ ์ฝ๋๊ฐ ํฌํจ๋ ์ง๋ฌธ์ ๊ฒ์ํ ์ ์์ต๋๊น?
AWS API-Gateway๋ฅผ ์ฌ์ฉํ ๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ณด๋ ์ฌ๋์๊ฒ๋ CORS ํค๋๋ก ์๋ตํ์ง ์๋ 4xx ์ค๋ฅ(๋ด ๊ฒฝ์ฐ์๋ 401)๊ฐ ์๋ ๋ฌธ์ ์ ๋๋ค. ์ด ๋น์ด๋จน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋ช ์๊ฐ์ ๋ณด๋์ต๋๋ค! ์ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ง์ ์๋ ค์ฃผ์ @jonathan-stone์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@codygreen ๋๋ ์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ผ๋ฉฐ https://forums.aws.amazon.com/message.jspa?messageID=763752์ ๋ถ๋ช์ณค์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๊น?
๋๊ตฌ๋ ์ง์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
์ ๋ฌธ์ ๋ Jest+ Axios์์ต๋๋ค. ์ด๊ฒ์ ๋ด package.json์ ์ถ๊ฐํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
"jest": {
"testEnvironment": "node"
}
์ด๊ฒ์ ์๋ํ์ง๋ง ์ง์ํ๋ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ error.response๊ฐ ๋คํธ์ํฌ ์ค๋ฅ์์ ๋น์ด ์์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด API ์ค๋ฅ์ ๋๋ค.
axios.request(options).catch(function(error) {
if (!error.response) {
// network error
} else {
// http status code
const code = error.response.status
// response data
const response = error.response.data
}
});
๋๊ตฌ๋ ์ง ์ด๊ฒ์ ๋ํ ์ต์์ ์๋ฃจ์ ์ ์ฐพ์์ต๋๊น? Axios ์ฌ๋๋ค์ ์ฝ๊ฐ์ ์์์๋ ๋๋ค :(
๋๋ ๋ํ ์ค๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ด ๋ด ์คํฌ๋ฆฝํธ์ ๋๋ค.
js
var url = "http://localhost:8000/";
Axios.get(url).then(function(response){
alert(response)
}).catch(function(error){
alert(error)
});
http://localhost :8000/ JSON ์๋ต์ ๋ฐํํฉ๋๋ค. ๋ค๋ฅธ ํธ์คํธ์์๋ ์๋ํ์ง ์์ต๋๋ค.
Cors ์ค๋ฅ์ผ ์ ์์ต๋๋ค.
87ํ, xhr ์ด๋ํฐ์์ '๋คํธ์ํฌ ์ค๋ฅ'๋ก ์ค์ ๋์์ต๋๊น? ์ค๋ฅ๋ฅผ ์ก์ ์ ์๋๋ก ์ด๊ฒ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
https://github.com/axios/axios/blob/d7f021b8d4cc50bfa0653011bc02452d234d1255/lib/adapters/xhr.js#L84 -L91
๋ฌธ์ ๋ ์๋์ง๋ง ๋ธ๋ผ์ฐ์ ๋ณด์์ผ๋ก ์ธํด ์์๋๋ ๋์์ ๋๋ค. XHR ์ค๋ฅ ์๋ต์ ์ด์ ์ค๋ฅ ์ํ ์ฝ๋์ ๋ํด ProgressEvent ๋ฅผ ์์ ํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. CORS์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๊ตฌ๋ ์ง ์ด์ ๋ํ ์ข์ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
@codygreen API Gateway ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ จ์ต๋๊น? ๋ ๋๋ฒ๊ทธํ๋ ๋ฐ ๋์์ด ๋๋ ์๋ต ์ํ ์ฝ๋๋ฅผ ํ์ ํ ์๋ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋์ผํ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ์๊ฒ ๊ทธ๊ฒ์ ํ์คํ CORS์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ OPTIONS ์์ฒญ์ ํ๊ณ ์์๊ณ (๋ ธ๋์์) ์ด์ ๋ํ ํธ๋ค๋ฌ ์ค์ ์ด ์์์ต๋๋ค. Axios๋ (์คํจํ) ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ์ง๋ง ์ ์๋์ง ์์ ์๋ต์ผ๋ก
return axios.httpClients.server.post('/someUrl, {
someData:some_data
}).then(response => {
console.log(response);
//the following errors out because response is undefined
if (response.data && response.data.success === true) {
}
}).catch(err => {
//catch never triggered
console.log(err)
});
์๋ต์ ์๋ต ์ฝ๋๋ ๋ฌด์์ ๋๊น? ๋คํธ์ํฌ ์ค๋ฅ์ธ ๊ฒฝ์ฐ Fetch API ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ ๋ ์ฝ์์ ๊ธฐ๋กํ์ง๋ง ๋ณด์์์ ์ด์ ๋ก JavaScript์ ์ ๋ฌํ์ง ์์ผ๋ฏ๋ก ๋ณธ๋ฌธ์ด ๋น์ด ์์ต๋๋ค. FETCH STANDERS๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์๋ต์ ๋คํธ์ํฌ ์ค๋ฅ์ ์ก์ธ์คํ๋ ค๋ฉด HTTP ์๋ต ์ฝ๋๋ฅผ 200์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์๋ต ๋ณธ๋ฌธ์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํฌํจํ์ญ์์ค.
๋ด ๋ฌธ์ ๋ DNS ๋ฌธ์ ์์ต๋๋ค. ์ฐํธ ๋ฐฐ๋ฌ๋ถ์์๋ ์๋ํ์ง๋ง axios์์๋ ์คํจํ์ต๋๋ค. ์ปฌ์ด ๊ฑฐ๊ธฐ์์๋ ์คํจํ๊ณ ์๋ค๋ ๊ฒ์ ์์๋ด๊ธฐ ์ํด ์ปฌ์ ์๋ํ์ต๋๋ค. ๊ทธ๋์ ๋ด DNS๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์ง ์์์ต๋๋ค. ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ํ์ธํ์ญ์์ค.
์ด๊ฒ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์ ์ฉ ๊ฐ๋ฅํ์ง ํ์คํ์ง ์์ง๋ง ๋ค์์ ์ด ๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ๋๋ค(์ฐ๋ฆฌ๊ฐ CORS๋ฅผ ๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ ๋).
ํ๋ก ํธ์๋ ์ธก์์ PUT
๋๋ POST
์์ฒญ์ ๋งค๊ฐ๋ณ์๋ก headers
๋ฅผ ์ ๋ฌํ๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
const axiosParams = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
},
};
axios.put(`${api.url}/like`, axiosParams)
.then((response) => {
// ...
});
๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋ ์ธก์์ Express์ ํจ๊ป CORS๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค.
// server.js
const express = require('express');
const app = express();
var cors = require('cors'); // Yep, you need to install this
app.use(cors()); // Works ๐
์ฌ๋ฌ๋ถ, ์ ๋ ์ด ๋ฌธ์ ๋ก ๊ณ ๋ฏผํ๋ค๊ฐ ๊ทธ๋ง ๋์์ต๋๋ค. ํ์ง๋ง ์ด์ Android ๊ธฐ๊ธฐ์์ ๋ด axios post network createError ๋ฌธ์ ๋ฅผ ์์๋์ต๋๋ค. axios ๋คํธ์ํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ axios์ ์ ๋ฌํ ์์ ๋ฐ์ดํฐ์ ์๋ชป๋ ์ ํ์ ๋ฐ์ดํฐ ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค. axios์์ ํ์ฉํ์ง ์๋ ์์ ๋ฐ์ดํฐ ๋งค๊ฐ ๋ณ์ ์ค ํ๋๋ก ์ด๋ฏธ์ง ๊ฐ์ฒด(Expo์ ImagePicker ๊ฐ์ฒด)๋ฅผ ํฌํจํ์ต๋๋ค. Axios๋ string, float, int ๋๋ image๋ง param์ผ๋ก ์์ ํ ์ ์์ต๋๋ค. image๋ param์ผ๋ก ์ ๋ฌํ ์ ์์ผ๋ฉฐ ์ด๋ฏธ์ง ์ ํ์ด ์๋๋ฉฐ ๋ฐ์ํ๋ ๊ธฐ๋ณธ ๊ฐ์ฒด์
๋๋ค. ์ ๊ฑฐํ๊ณ image.uri๋ฅผ param ๊ฐ์ ํ ๋นํ์ฌ ์ด๋ฏธ์ง ํ๋๋ฅผ param์ผ๋ก ํฌํจํ๋ฉด ์๋ํฉ๋๋ค. ์ด์ ์ ๋ด๊ฐ ์ง๋ฉดํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ ์ ์๋ ์ฌ๋๋ค์๊ฒ ์ด๊ฒ์ด ๋์์ด ๋๊ธธ ๋ฐ๋๋๋ค.
axios ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ํ
์คํธํ ๋ ์์ ๋ฐ์ดํฐ ์ค ์ผ๋ถ๋ฅผ ํ๋์ฉ ์ญ์ ํ๋ฉด ์ด๋ ๊ฒ์ด ๋ฌธ์ ์ ์์ธ์ธ์ง ์ ์ ์์ต๋๋ค.
~ @codygreen @hammadzz Amazon API Gateway์์ ์ด์ ๋ํ ์๋ฃจ์ ์ ์ฐพ์์ต๋๊น?~
์
๋ฐ์ดํธ: ๋๊ตฐ๊ฐ API Gateway ๋ฐ CORS๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ต์ access-control-allow-origin
์๋ต ํค๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
#204์์ ๋๊ตฐ๊ฐ๊ฐ ๋งํ๋ฏ์ด ๋ธ๋ผ์ฐ์ ์์ ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ์ก์ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ด์ Axios๋ ์ผ๋ฐ ์ค๋ฅ(
new Error('Network error')
)๋ก ์๋ตํฉ๋๋ค. ์๋ชป๋ ์๋ต(์ํ ์ฝ๋ !== 2xx ๋๋ ์ฌ์ฉ์ ์ง์ ๊ฒ์ฌ)๊ณผ ๊ตฌ๋ณํ๋ ค๋ฉด ์ค๋ฅ ๋ฉ์์ง ๋์status
์์ฑ์ ํ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์:axios.request(options).catch(function(error) { if (!error.status) { // network error } });
์ฌ์ฉ์ ์ง์ ์ํ ์ฝ๋๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์ข์ง ์์ ์๊ฐ์ด๊ณ (๋ ๋ง์ ํผ๋์ ์ผ์ผํฌ ์ ์์) ํน์ ์์ฑ์ ์ค์ ํ๋ ๊ฒ์ ๋จ์ผ ์ค๋ฅ ์ฌ๋ก๋ง ์๊ธฐ ๋๋ฌธ์ ์ ํ ๋์์ด ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก Node.js์์๋ ์ค์ ์ค๋ฅ์ ์ก์ธ์คํ ์ ์๊ณ Node.js ๋ฌธ์์ ๋ฐ๋ผ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ฝ์ต๋๋ค.
Google์์ ์จ ๊ฒฝ์ฐ ์ด API๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ 2016๋ , v <0.13์ ๋๋ค.
๋น์ ์ ํ์ธํ๋ ค๋ฉด error.response
์๋ฒ ์๋ต, error.response === undefined
์คํ๋ผ์ธ ์ํ์ ํน๋ณํ ๊ฒฝ์ฐ์ error.code === 'ECONNABORTED'
์๊ฐ ์ ํํฉ๋๋ค.
์ ๋ฐ์ดํธ: ๋๊ตฐ๊ฐ API Gateway ๋ฐ CORS๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ต์ ์๋ต ํค๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
access-control-allow-origin: *
ํ์คํ ์ด๋ ๊ฒ ํ์ง ๋ง์ญ์์ค. *
๋์ ์๋ณธ์ ์ ์ ํ๊ฒ ์ค์ ํ์ญ์์ค.
๋์๊ฒ ๊ทธ๊ฒ์ cors ๋ฌธ์ ์์ต๋๋ค. ๋ง์ฝ ๋น์ ์ด laravel์ ์ฌ์ฉํ๊ณ ์๊ณ ๋น์ ์ด ์ ์ํ๋ค๋ฉด
->middleware(['auth:api'])
์ด ๊ฒฝ๋ก์ ๋ช ์์ ์ผ๋ก ์์๋์ง ์์ ๋ค๋ฅธ ๋ชจ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
->middleware(['auth:api','cors']);
๋๋ ๋ํ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. localhost ๋์ ๋ก์ปฌ IP ์ฃผ์๋ฅผ ์ฌ์ฉํ์ญ์์ค(์: 10.0.0.12:8083 ). ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ๋ฐ๋ฅธ ๊ฒฝ์ฐ axios ์์ฒญ์ 0 ์ํ๊ฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ํํ ์ด๋ค ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋์ง ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ฒฐ์ ํ ์๋ ์์ต๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ์๋ CORS ์คํ ์ ์์ฒญ ์ด ์คํจํ์ฌ ์ค์ ์์ฒญ์ด ์๋์กฐ์ฐจ ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด ๋๋ฌธ์ 404 ์ํ๋ ์ ์ ํ์ง ์์ต๋๋ค.
๋๊ตฐ๊ฐ @joelnet ๋งฅ์ฃผ๋ฅผ ์ฌ์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ด ํ๋ฃจ๋ฅผ ๊ตฌํ์ต๋๋ค.
https://github.com/axios/axios/issues/383#issuecomment -308606088
๋ค๋ฅธ ์ฌ๋๋ค์ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๊ฐ์ง ์ ์์ง๋ง ์ ์๊ฒ๋ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
๊ฐํ์ ์ผ๋ก ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. CORS ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด API/์๋ฒ๋ .net ์๋ฒ์
๋๋ค.
๊ฐํ์ ์ผ๋ก ์ด ๋ฌธ์ ์ ์ง๋ฉดํ ๋ค๋ฅธ ์ฌ๋์ด ์์ต๋๊น?
HTTP ๋๋ https๋ฅผ ์ง์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฃผ๋ก ์ฝ๋ ์์ฒด๊ฐ ์ ์๋์ง ์์ ํ๋กํ ์ฝ์์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ด๊ฒ์ ์ฒ๋ฆฌ๋๊ฑฐ๋ ์ค๋ฅ ๋ฉํ์์ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
@jonathan-stone์ด ๋งํ๋ฏ์ด Axios๋ ๋จ์ํ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๊ณ ์น ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ Funyuns๋ฅผ ์ํด ์น๊ตฌ๋ฅผ ๋ณด๋ด๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์์ ์ด ๋ฌธ์ ๋ซ์๋ค๊ณ ๋งํฉ๋๋ค. "ํญ์ ์ด๋ ค ์์"์ด๋ผ๊ณ ๋์ด ์์ต๋๋ค. ์ ๊ฐ๊ฒ๊ฐ ๋ฌธ์ ๋ซ์์ต๋๊น? ๊ทธ๋ค์ ์์ํ ๋ฌธ์ ๋ซ์์ต๋๊น(404)? ์ํ ์ฌ๋์ด ์์ต๋๊น(500)? ์ฌ๊ณ ๊ฐ ๋ฐ๋ฅ๋ฌ์ต๋๊น(503)? ๊ทธ๋ ๋ชฐ๋ผ์, ๊ทธ๋ฅ ๋ซํ์ด์(๋คํธ์ํฌ ์ค๋ฅ)!
๋ด API์์ ๋ค์ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ค๊ณ ์๋ํ๋ ๋ก์ปฌ Express ์๋ฒ์ ๋ํด Axios๋ฅผ ์ฐ์์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์คํํ ๋ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. Axios๊ฐ ์ ํํ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ์ง ์์ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ ์ง ์์ต๋๋ค. ์ Express ์๋ฒ๋ ๋๋ฌด ๋ฐ๋น ์ ์๋ฌด ์๋ต๋ ํ์ง ์์์ต๋๋ค.
์์ฒญ์ ์ฌ์๋ํ๋ฉด( #164 ์ retry-axios ์ฌ์ฉ) AVAILABLE ์๋ฒ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ์ป๊ฑฐ๋ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ํญ์ ์ง์ ํด์ผ ํฉ๋๋ค.
์์ง์์ค
add_header '์ ๊ทผ-์ ์ด-ํ์ฉ-์์ ' * ํญ์ ;
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ํญ์ ์ง์ ํด์ผ ํฉ๋๋ค.
์์ง์์คadd_header '์ ๊ทผ-์ ์ด-ํ์ฉ-์์ ' * ํญ์ ;
์ด๋ฌ์ง ๋ง. ์ ๋ ํ์ง ๋ง์ธ์. ํ๋์ ์ฐ๊ฒฐ์ ํ์ฉํ๊ธฐ ์ํด ๋ฐฉํ๋ฒฝ์ ๋นํ์ฑํํ์ง ์์ ๊ฒ์ ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ฐ๋ฆฌ๋ ํ๋ก์์ ์ํฐํฐ ํฌ๊ธฐ ๋ณดํธ๋ฅผ ์ค์ ํ์ต๋๋ค. ์ผ๋ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง๋ง 413 ์ํ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค... ์ด๋ป๊ฒ๋ ๊ฐ๋ฅํ๊ฐ์?
response
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋ณด์
จ์ต๋๊น?
axios.get(url).then(stuff => console.log(Object.keys(stuff.response));
@ComputerCarl ์ฑ๊ณต ์๋ต์ด ์๋ค๊ณ ์๊ฐํ์ญ๋๊น? catch
๋๋๋ฏ๋ก ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ๋ง์ญ์์ค. ํ์ง๋ง ์๋ํด ๋ณผ ์ ์์ต๋๋ค ...
์ฃ์กํฉ๋๋ค! ๋ด ๋จธ๋ฆฌ๋ ๋ค๋ฅธ ๊ณณ์ ์์๋ค! catch ๊ฐ์ฒด ํ์ธ ...catch(err => console.log(Object.keys(err.response));
๋ด ํ๋ก๊ทธ๋จ ์ค ํ๋์ ์์ต๋๋ค.
err.response.data.message;
๋ด๊ฐ Express์์ ๋ณด๋ธ ๊ฒ;
app.use(function (err, req, res, next) {
res.status(err.status || 500);
// this is err.response.data on Axios client
res.send({ message: 'my custom error' });
});
@ComputerCarlํ์ง๋ง error.response
๋์ผ, ์ ์๋์ง error.status
๋น์ ์ ์คํฌ๋ฆฐ ์ท์์ ๋ณผ ์ ์์ต๋๋ค :), ๋๋ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ console.log
์ด๋ฏธ. ๋ณด์๋ค์ํผ error.request
๋ง XMLHttpRequest ๊ฐ์ฒด์
๋๋ค.
์ข์.. ์ ๋ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค(CORS์ ํจ๊ป 413). ๊ทธ๋ฌ๋ Express๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ CORS๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค.
const cors = require('cors');
// ...
app.use(cors());
๋ํ ์์์ ์ธ๊ธํ๋ฏ์ด ์๋ฒ๊ฐ ๊ทํ์ ์์ฒญ์ ์์ ํ ๊ฑฐ๋ถํ๋ฉด Axios๋ ์ค๋ฅ์ ์์ธ์ ์์ง ๋ชปํฉ๋๋ค. ์ด ์์ ์์ ๋๋ ๋นํฉํ๊ณ ๋น์ ์ ๋ ๋๋ํ ๋๊ตฐ๊ฐ๊ฐ ๋๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ ๊ฒ์ ๋๋ค. :-)
@ComputerCarl ์๋ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :-D CORS๋ ๊ด์ฐฎ์ต๋๋ค. ์ฑ์์ ๋์ผํ API์ ๋ํ ๋ค๋ฅธ ํธ์ถ์ด ๋ง์ด ์์ผ๋ฉฐ ์ ๋๋ก ์๋ํฉ๋๋ค. API์์ ๋ฐํ๋ ์ค๋ฅ๋ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ ์ด๊ฒ์ด ํ๋ก์ ์์ค์์ ์ทจ์๋์๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ๋์์ด ๋ ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์์ฒญ์ ํ๋ก์ํ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์์ต๋๋ค. ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์๋ ํ๋ ์์ํฌ๊ฐ Express ์ค๋ฅ๋ฅผ ์ก์๋จน๊ณ ์์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก res.send({ message: messageFromProxy });
์ค๋ฅ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ๋ฌํ ํ ํด๋ผ์ด์ธํธ์์ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ์ฒ๋ฆฌํ ์ ์์์ต๋๋ค.
ํ์ด์ ๋น๋๋ค.
@jonathan-stone์ "๋คํธ์ํฌ ์ค๋ฅ๋ Axios๊ฐ ์๋ฒ์ ์ ํ ์ฐ๊ฒฐํ ์ ์์์ ์๋ฏธํ๋ฏ๋ก ์๋ฒ์์ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์์ต๋๋ค.
error.data ;
๋น์ ์ ๋ด๊ฐ ๋ณด๋ธ ์คํฌ๋ฆฐ ์ท์์ ๋ณผ ์ ์๋ฏ์ด @ balwant-SD ์ด๊ณณ์ , ๋ธ๋ผ์ฐ์ ๋ ์ ํํ๊ฒ 413 ์ํ ์ฝ๋๋ฅผ ์ธ์ํ์ง๋ง Axios์ํ์ง ์์ต๋๋ค
๋คํธ์ํฌ ํญ์์๋ 413 ์ํ ์ฝ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค ...
์์์ ์ธ๊ธํ๋ฏ์ด 401 ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋ก๊ทธ์ธ POST๋ 401 ๋์ ์ ์๋์ง ์์ ์ฝ๋์ ํจ๊ป '๋คํธ์ํฌ ์ค๋ฅ'๋ง ๋ฐํํฉ๋๋ค.
๋ฐ๋ผ์ ์ด ์ค๋ฅ๋ ๋คํธ์ํฌ ํญ์๋ง ๋ฐ์๋๋ ์๋ชป ๊ตฌ์ฑ๋ CORS ์ค๋ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. @ketysek ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๋ด ngnix๊ฐ ์ด์ ๋ํด CORS๋ฅผ ์ ์ฉํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ์ ์ธ๊ธํ๋ฏ์ด ์ผ๋ฐ ๋คํธ์ํฌ ์ค๋ฅ๋ axios error.response
๊ฐ ๋์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ ๋ ๋ฐฑ์๋๋ฅผ ๋น๋ํ๊ณ ์ถ์ต๋๋ค. ์ค ์ ๊น, ์ ๊ฐ ๊ทธ๋ฌ์ต๋๋ค...
์๋ ํ์ธ์, ์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ์ ํ ์๋ต axios๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ์๋ ํญ์ "๋คํธ์ํฌ ์ค๋ฅ"๋ฅผ ๋ฐํํ๊ณ .catch(function(error) {}); ํ๊ฐ. ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์๋ ์ฌ๋์ด ์์ต๋๊น?
๋๋ ์ค๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค. ์ด ๋ฌธ์ ๋ ์ฃผ๋ก ๋ฐฑ์๋๊ฐ ์ฌ์ดํธ ๊ฐ HTTP ์์ฒญ์ ํ์ฉํ์ง ์๋ ๊ฒ์ ๊ดํ ๊ฒ์
๋๋ค. ์ ๊ฒฝ์ฐ์๋ django๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก corsheaders ํด๋์ค๋ฅผ MIDDLEWARE์ ๊ฐ๋ฅํ ํ ๋๊ฒ ๋ฐฐ์นํ์ต๋๋ค.
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', //..etc
]
๊ทธ๋ฆฌ๊ณ ํน์ ์ถ์ฒ๋ง ํ์ฉํ๋๋ก CORS_ORIGIN_WHITELIST๋ฅผ ๋ง๋ค์์ต๋๋ค.
CORS_ORIGIN_WHITELIST = [ "http://localhost:8081" ,
//..etc
]
์ด๊ฒ์ django-cors-headers์ฉ์
๋๋ค. django ์ฌ์ฉ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ข์ํ๋ cors ํค๋ ๋ชจ๋์ ์ค๋ช
์๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
#204์์ ๋๊ตฐ๊ฐ๊ฐ ๋งํ๋ฏ์ด ๋ธ๋ผ์ฐ์ ์์ ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ์ก์ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ด์ Axios๋ ์ผ๋ฐ ์ค๋ฅ(
new Error('Network error')
)๋ก ์๋ตํฉ๋๋ค. ์๋ชป๋ ์๋ต(์ํ ์ฝ๋ !== 2xx ๋๋ ์ฌ์ฉ์ ์ง์ ๊ฒ์ฌ)๊ณผ ๊ตฌ๋ณํ๋ ค๋ฉด ์ค๋ฅ ๋ฉ์์ง ๋์status
์์ฑ์ ํ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์:axios.request(options).catch(function(error) { if (!error.status) { // network error } });
์ฌ์ฉ์ ์ง์ ์ํ ์ฝ๋๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์ข์ง ์์ ์๊ฐ์ด๊ณ (๋ ๋ง์ ํผ๋์ ์ผ์ผํฌ ์ ์์) ํน์ ์์ฑ์ ์ค์ ํ๋ ๊ฒ์ ๋จ์ผ ์ค๋ฅ ์ฌ๋ก๋ง ์๊ธฐ ๋๋ฌธ์ ์ ํ ๋์์ด ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก Node.js์์๋ ์ค์ ์ค๋ฅ์ ์ก์ธ์คํ ์ ์๊ณ Node.js ๋ฌธ์์ ๋ฐ๋ผ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ฝ์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ๋ axios.then์์ ์ผ๋ถ ์ฝ๋๋ฅผ ์คํํ๊ณ ์ฝ๋์ "์์์ ๋ํ ํ ๋น"(์ ์ ๊ฒฝ์ฐ)๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ธ๊ธํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด " ์์ ํ ๋น"
์ฝ๋ ์:
axios(options).then(() => {
const foo = '';
foo = 'bar'; // will throw error "assignment to constant"
}).catch(error => {
if (!error.status) {
// "assignment to constant" will be considered as network error
}
})
์ด ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ ์คํ์ ํ์์์ ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค(๋น-axios ์ค๋ฅ๋ฅผ ๋คํธ์ํฌ ์ค๋ฅ๋ก ์๋ณํ๋ ๊ฒ์ ๋ฐฉ์งํจ).
function isNetworkError(err) {
return !!err.isAxiosError && !err.response;
}
์ด ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ ์คํ์ ํ์์์ ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค(๋น-axios ์ค๋ฅ๋ฅผ ๋คํธ์ํฌ ์ค๋ฅ๋ก ์๋ณํ๋ ๊ฒ์ ๋ฐฉ์งํจ).
function isNetworkError(err) { return !!err.isAxiosError && !err.response; }
#1419 ์ฐธ์กฐ
๋ฌธ์ ํด๊ฒฐ
๊ฐ์ฌ ํด์
@mifi axios ๊ฐ ์๋ ์ค๋ฅ๋ฅผ ๋คํธ์ํฌ ์ค๋ฅ๋ก ์๋ณํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด isNetworkError
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ ์์ธํ ์๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๊น?
๋ค์๊ณผ ๊ฐ์ด
try {
...
some code that calls axios
...
} catch (err) {
if (isNetworkError(err)) return alert(โcheck your connection);
throw err;
}
CORS ์ค๋ฅ์ด๊ณ Serverless๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ ์ ์์ต๋๋ค.
resources:
Resources:
# CORS for 4xx errors
GatewayResponseDefault4XX:
Type: 'AWS::ApiGateway::GatewayResponse'
Properties:
ResponseParameters:
gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
ResponseType: DEFAULT_4XX
RestApiId:
Ref: 'ApiGatewayRestApi'
์๋
ํ์ธ์, ๋๊ตฐ๊ฐ ์ ๋ฅผ ๋์์ค ์ ์์ต๋๊น? '๋คํธ์ํฌ ์ค๋ฅ':
https://stackoverflow.com/questions/58717673/axios-sending-network-error-while-status-is-200-ok
์ค๋ฅ๊ฐ "๋คํธ์ํฌ ์ค๋ฅ"์ธ ๊ฒฝ์ฐ Axios๊ฐ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์๊ฑฐ๋ ์ด๋ค ์ด์ ๋ก ์๋ฒ์์ ์๋ต์ ๋ฐ์ง ๋ชปํจ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ 401 ์ค๋ฅ๋ Axios์ ๋ฐ์ํ์ง ์์ต๋๋ค. StackOverflow์ ๋ช ๊ฐ์ง ์ํ ์ฝ๋๊ฐ ํฌํจ๋ ์ง๋ฌธ์ ๊ฒ์ํ ์ ์์ต๋๊น?
๋ํ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ์๊ฒ๋ ์๋ฒ์ ๋๋ฌํ์ผ๋ฉฐ 403 ๋ฐ JSON์ผ๋ก ์๋ตํ์ฌ Axios์์ Network Error
๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋คํธ์ํฌ ํญ์์ ์๋ต์ ๋ณผ ์ ์์ง๋ง catch ๋ธ๋ก์์ err.response
๊ฐ ์ ์๋์ง ์์์ต๋๋ค.
@narenderv7 ๋๋
@WarisR ์๋ฒ ์ธก์์
์๋ฒ์ ์ถ๊ฐ 'Access-Control-Allow-Origin': '*'
@ketysek ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ด ์ค๋ฅ๋ฅผ ์ก์ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๊น?
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ํ 403(4 * & 5 )์ผ๋ก ์๋ต์ ๋ฐ๊ณ ์๋ CORS ์ค๋ฅ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.Nginx ์ ์ก ํค๋ "Access-Control-Allow-Origin"์ ์๋ต ์ํ 2 ๋ฐ 3์ *.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๋ค์์์ nginx ๊ตฌ์ฑ์ ํธ์งํฉ๋๋ค.
add_header 'Access-Control-Allow-Origin' '*';
์๊ฒ:
add_header 'Access-Control-Allow-Origin' '*' always;
axios 0.18.0 ๋ฐ 0.19.0์ ์ฌ์ฉํ์ฌ ํ ์คํธํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋จ๊ณ:
๋๋ ๋ง๋ฃ๋ ํ ํฐ์ผ๋ก ์์ฒญ์ ํ๊ณ ๋๋๋ก error.response๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์์ง๋ง ๋๋ก๋ ์ค๋ฅ ์๋ต์ด ์ ์๋์ง ์๊ณ ๋ฉ์์ง๊ฐ '๋คํธ์ํฌ ์ค๋ฅ'์
๋๋ค. ๋ฐฑ์๋ ์ค๋ฅ ๋๋ axios์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋๋ก๋ ๋ธ๋ผ์ฐ์ ์ AD ์ฐจ๋จ๊ธฐ๋ก ์ธํด ๋ฐ์ํ ์ ์์ต๋๋ค ...
incognito
๋๋ private
๋ชจ๋๋ฅผ ์๋ํ๊ฑฐ๋ ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ํ
์คํธํ์ญ์์ค...
@narenderv7 ๋ค, ์๋ฒ์ธก ์ค์์ ๋๋ค. ํ์ง๋ง Axios๋ ์ด ๊ฒฝ์ฐ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ณํด์ผ ํฉ๋๋ค.
๋ด๊ฐ ํ์ธํ ๋๋ก. catch
๋ธ๋ก์ ์ํ ์ค๋ฅ ๋ฐํ์ ์์ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋์ผํฉ๋๋ค.
์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
https://github.com/axios/axios/issues/1296
์ค๋ฅ๊ฐ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์๋ ์ฌ๋์ด ์์ผ๋ฉด ๊ณต์ ํด ์ฃผ์ญ์์ค.
์ด ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ ์คํ์ ํ์์์ ๋คํธ์ํฌ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค(๋น-axios ์ค๋ฅ๋ฅผ ๋คํธ์ํฌ ์ค๋ฅ๋ก ์๋ณํ๋ ๊ฒ์ ๋ฐฉ์งํจ).
function isNetworkError(err) { return !!err.isAxiosError && !err.response; }
#1419 ์ฐธ์กฐ
์๊ฐ ์ด๊ณผ ์ค๋ฅ๋ ์ด๋ฌํ ์กฐ๊ฑด๊ณผ๋ ์ผ์นํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋ฌด๋ ๋๋ฅผ ๋์์ค ์ ์์ต๋๊น?
์๋ฒ ์๋ต์ 401์ด์ง๋ง axios๋ ๋ค์์ ์ ๊ณตํฉ๋๋ค.
์ค๋ฅ --> "๋คํธ์ํฌ ์ค๋ฅ"
error.response --> ์ ์๋์ง ์์
error.status --> ์ ์๋์ง ์์