Axios: "๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜"์— ๋Œ€ํ•œ ์ฝ”๋“œ/์ƒํƒœ ์„ค์ •

์— ๋งŒ๋“  2016๋…„ 07์›” 20์ผ  ยท  69์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: axios/axios

์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋œ ์‹œ๊ฐ„์„ ๊ฐ์ง€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ 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.???)๊ฐ€ ์ฝ”๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œํ™”๋œ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ˆ„๋ฝ๋œ ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋‚˜๋ฅผ ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์„œ๋ฒ„ ์‘๋‹ต์€ 401์ด์ง€๋งŒ axios๋Š” ๋‹ค์Œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ --> "๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜"
error.response --> ์ •์˜๋˜์ง€ ์•Š์Œ
error.status --> ์ •์˜๋˜์ง€ ์•Š์Œ

๋ชจ๋“  69 ๋Œ“๊ธ€

๋‚ด ์ƒ๊ฐ ์—” ๋‹น์‹ ์ด ๋งž๋‹ค. ์ƒํƒœ ์ฝ”๋“œ๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

#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 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค... ์–ด๋–ป๊ฒŒ๋“  ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

Screenshot 2019-05-07 at 14 19 26

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 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...
Screenshot 2019-06-03 at 15 42 12

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด 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;
}

https://github.com/axios/axios/pull/1419 ์ฐธ์กฐ

์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ ์Šคํƒ์˜ ํ•˜์œ„์—์„œ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค(๋น„-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 ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

image

image

@narenderv7 ๋‚˜๋„

@WarisR ์„œ๋ฒ„ ์ธก์—์„œ

์„œ๋ฒ„์— ์ถ”๊ฐ€ 'Access-Control-Allow-Origin': '*'

@ketysek ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Screenshot from 2019-12-26 16-48-22

์ด ์˜ค๋ฅ˜๋ฅผ ์žก์„ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ƒํƒœ 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 ์ฐธ์กฐ

์‹œ๊ฐ„ ์ดˆ๊ณผ ์˜ค๋ฅ˜๋Š” ์ด๋Ÿฌํ•œ ์กฐ๊ฑด๊ณผ๋„ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
image

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰