Angular.js: $http μ„œλΉ„μŠ€κ°€ 400μ—μ„œ 였λ₯˜ μ½œλ°±μ„ ν˜ΈμΆœν•˜μ§€ μ•ŠμŒ

에 λ§Œλ“  2013λ…„ 05μ›” 08일  Β·  26μ½”λ©˜νŠΈ  Β·  좜처: angular/angular.js

버전: 1.1.4

createNewWall: function(wall, successCallback, errorCallback) {
    return $http.post($rootScope.baseAppsAPI + '/walls', null, {
       params: wall
    }).success(function(data, status) {
       return successCallback.call(this, data);
    }).error(function(data) {
       return errorCallback.call(this, data);
    });
}

angular isSuccess ν•¨μˆ˜κ°€ μ œλŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것을 window 객체에 μΆ”κ°€ν•˜κ³  μ•„λž˜ μ½”λ“œ(λ‚΄ 성곡 μ½œλ°±μ— 배치)둜 인해 였λ₯˜ 콜백이 ν˜ΈμΆœλ˜λŠ”μ§€ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

if (window.isSuccess(status)) {
   return successCallback.call(this, data);
} else {
  return errorCallback.call(this, data);
}

문제의 원인에 λŒ€ν•œ 아이디어가 μžˆμŠ΅λ‹ˆκΉŒ? $http 약속이 μ˜¬λ°”λ₯΄κ²Œ κ±°λΆ€/ν•΄κ²°λ˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜λ₯Ό μœ„ν•΄ @lsiv568 의 source )λ₯Ό λΉŒλ“œν•  λ•Œ κ±°λΆ€λœ 약속을 μˆ˜λ™μœΌλ‘œ λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

.factory('myInterceptor', function($q) {
  return {
    response: function (response) { return response; },
    responseError: function(response) {
      // do stuff or
      return $q.reject(response);
    }
  };
});

λͺ¨λ“  26 λŒ“κΈ€

λ‚˜λŠ” 같은 λ¬Έμ œμ— 직면 ν•΄μžˆλ‹€. 문제λ₯Ό μ’…λ£Œν•œ 방식은 λ‚΄κ°€ λ­”κ°€ 잘λͺ»ν•˜κ³  μžˆλ‹€λŠ” 것을 μ˜λ―Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄κ²° 방법을 κ³΅μœ ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ? 이것은 μ–΄λ””μ—μ„œλ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.

λ‘œλ²„νŠΈ.,

λ¬Έμ œκ°€ (기적적으둜) ν•΄κ²°λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 문제λ₯Ό λ‹«μ•˜μŠ΅λ‹ˆλ‹€.
λ‚΄ μ„œλΉ„μŠ€λ₯Ό μ•½κ°„ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ λŒμ•„μ˜¬ 것 κ°™λ‹€.
κ°„ν—μ μœΌλ‘œ. κ·Έλž˜μ„œ 더 이상 λ‚΄ μͺ½μ˜ λ¬Έμ œμΈμ§€ μ•„λ‹ˆλ©΄
κ°λ„μ˜ μ§„μ •ν•œ 문제. μ›ν•˜λŠ” 경우 문제λ₯Ό λ‹€μ‹œ μ—΄ 수 μžˆμŠ΅λ‹ˆλ‹€.
문제λ₯Ό μΆ”κ°€ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? 그게 당신을 μœ„ν•΄ μž‘λ™ν•©λ‹ˆκΉŒ?

2013λ…„ 5μ›” 13일 μ›”μš”μΌ μ˜€μ „ 9μ‹œ 13뢄에 Robert [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 같은 λ¬Έμ œμ— 직면 ν•΄μžˆλ‹€. 당신이 문제λ₯Ό 닫은 방식은 λ‚΄κ°€
잘λͺ»λœ 일을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ†”λ£¨μ…˜μ„ κ³΅μœ ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ? μΊ”νŠΈ
μ–΄λ””μ„œλ‚˜ 이것을 μ°ΎμœΌμ‹­μ‹œμ˜€.

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ Gi tHubhttps://github.com/angular/angular.js/issues/2609#issuecomment -17810417μ—μ„œ ν™•μΈν•˜μ„Έμš”.
.

κ³΅μ†νžˆ,

루이슀 W. μ‹œλΉŒλ‘œ

μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ 이 λ¬Έμ œλŠ” κ°„ν—μ μœΌλ‘œ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— λ‹€μ‹œ μ—½λ‹ˆλ‹€. rtpm, 문제λ₯Ό μ‹λ³„ν•˜λŠ” 데 도움이 될 수 μžˆλŠ” μ‚¬μš© 사둀/μΆ”κ°€ 정보λ₯Ό ν¬ν•¨ν•˜μ„Έμš”.

λ‘œλ²„νŠΈ,
ν•¨κ»˜ λ³΄λ‚΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

응닡 였λ₯˜μ— λŒ€ν•œ 약속을 κ±°λΆ€ν•˜μ§€ μ•ŠλŠ” κΈ°λ³Έ 인증을 μœ„ν•΄ μž‘μ„±ν•œ http 인터셉터가 μžˆμŠ΅λ‹ˆλ‹€.

λ΄‡λ‹˜ κ°μ‚¬ν•©λ‹ˆλ‹€. λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆλ‹€.

μ„œλ²„κ°€ 401을 λ°˜ν™˜ν•˜λ©΄ +1이 λ°œμƒν•©λ‹ˆλ‹€.

+1
μ„œλ²„κ°€ 401 μƒνƒœ μ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” λ™μ•ˆ 콜백 κΈ°λŠ₯이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ 진전이 μžˆμŠ΅λ‹ˆκΉŒ? 400κ³Ό 같은 λ¬Έμ œμ— μ§λ©΄ν–ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λ₯Ό μœ„ν•΄ @lsiv568 의 source )λ₯Ό λΉŒλ“œν•  λ•Œ κ±°λΆ€λœ 약속을 μˆ˜λ™μœΌλ‘œ λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

.factory('myInterceptor', function($q) {
  return {
    response: function (response) { return response; },
    responseError: function(response) {
      // do stuff or
      return $q.reject(response);
    }
  };
});

400κ³Ό 같은 λ¬Έμ œμ— 직면..
κ·ΈλŸ¬λ‚˜ λ¬Έμ œκ°€ μ’…λ£Œλœ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 이 λ¬Έμ œμ— λŒ€ν•œ νŠΉμ • ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

λ˜ν•œ 였λ₯˜ 400κ³Ό ν•¨κ»˜ 이 λ¬Έμ œμ— μ§λ©΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ μ–΄λ–€ λ²„μ „μ—μ„œ?

λͺ¨λ“  >299 였λ₯˜μ™€ λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž 지정 응닡 인터셉터와 ν•¨κ»˜ Restangularλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ CSRF 토큰 헀더λ₯Ό μ œμ™Έν•˜κ³  κΈ°λ³Έ μ œκ³΅λ˜λŠ” $http μ„œλΉ„μŠ€μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. (μ–΄μ¨Œλ“  Restangular λ‚΄μ—μ„œ μˆ˜λ™μœΌλ‘œ μ§€μ—°λœ 개체λ₯Ό κ±°λΆ€ν•˜λ €κ³  μ‹œλ„ν–ˆμ§€λ§Œ μ˜ˆμƒλŒ€λ‘œ 아무 것도 λ³€κ²½λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.)

저도 이 λ¬Έμ œκ°€ λ°œμƒν–ˆλŠ”λ° λ‹€μ‹œ μ—΄ 수 μžˆλ‚˜μš”?

μ›λž˜ λ¬Έμ œμ—μ„œ 보고된 λ¬Έμ œλŠ” μ‚¬μš©μž μ •μ˜ 인터셉터가 였λ₯˜ 쑰건을 μ œλŒ€λ‘œ μ²˜λ¦¬ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€(약속이 κ±°λΆ€λ˜μ§€ μ•ŠμŒ). λˆ„κ΅°κ°€ μ—¬μ „νžˆ 문제λ₯Ό κ²ͺκ³  μžˆλ‹€λ©΄ μ•„λ§ˆλ„ 같은 상황일 κ²ƒμž…λ‹ˆλ‹€. 버그가 μžˆλŠ” μ‚¬μš©μž 지정 인터셉터가 μ—†λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€. μ—¬μ „νžˆ AngularJS μΈ‘μ—μ„œ 무언가가 μ˜³μ§€ μ•Šλ‹€κ³  μƒκ°λ˜λ©΄ _μ΅œμ†Œν•œμ˜ 라이브_μž¬ν˜„ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ œκ³΅ν•˜μ‹­μ‹œμ˜€(μ΄μƒμ μœΌλ‘œλŠ” http://plnkr.co/λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ λ‹€λ₯Έ μœ μ‚¬ν•œ 도ꡬ도 κ°€λŠ₯ν•©λ‹ˆλ‹€).

@pkozlowski-opensource κ°μ‚¬ν•©λ‹ˆλ‹€. μ‹€μ œλ‘œ 그것이 제 λ¬Έμ œμΈμ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€(d'oh).

이에 κ΄€ν•΄ Angular λ¬Έμ„œμ— λ©”λͺ¨κ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ‚΄ 인터셉터λ₯Ό κ΅¬ν˜„ν•˜λŠ” $http 약속 λ™μž‘μ„ μ™„μ „νžˆ μž¬μ •μ˜ν•˜κ³  μžˆλŠ”μ§€ μ „ν˜€ λͺ°λžμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œμ΄ λ¬Έμ œμ— λΆ€λ”ͺμ³€κ³  μ‹€μ œλ‘œ μ˜¬λ°”λ₯Έ λ°˜ν™˜μ„ν–ˆκΈ° λ•Œλ¬Έμ— λ°˜λ³΅ν•΄μ„œ λ³΄λŠ” 인터셉터λ₯Ό κ°€μ§€κ³ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ“œλ””μ–΄ 범인을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. 성곡/였λ₯˜μ— λŒ€ν•œ μ—¬λŸ¬ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜κ±°λ‚˜ μ‹€μ œλ‘œ μ˜¬λ°”λ₯Έ 것을 λ°˜ν™˜ν•˜λŠ”μ§€ 확인해야 ν•©λ‹ˆλ‹€. 성곡 μ½œλ°±μ€ μˆ˜μ •λœ 응닡을 λ°˜ν™˜ν•΄μ•Ό ν•˜κ³  였λ₯˜ μ½œλ°±μ€ 인터셉터와 λ§ˆμ°¬κ°€μ§€λ‘œ $q.reject와 ν•¨κ»˜ κ±°λΆ€λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

+1 κ°μ‚¬ν•©λ‹ˆλ‹€. $ http.interceptor의 μ „μ—­ μ‚¬μš©μž μ •μ˜μ™€ λ™μΌν•œ λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

@chmanie 의 닡변에 +1μž…λ‹ˆλ‹€. 맀우 κ°μ‚¬ν•©λ‹ˆλ‹€! 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

+1 @chmanieλ‹˜ κ°μ‚¬ν•©λ‹ˆλ‹€! λ‚΄ λ¬Έμ œλ„ ν•΄κ²°

+1 κ°μ‚¬ν•©λ‹ˆλ‹€. κ±°λΆ€ν•˜λ©΄ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

+1 .λ‚΄ 문제λ₯Ό ν•΄κ²°ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

+1 κ°μ‚¬ν•©λ‹ˆλ‹€. κ±°λΆ€ν•˜λ©΄ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

@chmanie 의 μ†”λ£¨μ…˜μ΄ μ €μ—κ²Œ νš¨κ³Όμ μž…λ‹ˆλ‹€.

@chmanie μ†”λ£¨μ…˜μ΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. Angularjs λ¬Έμ„œμ— 이에 λŒ€ν•œ λ©”λͺ¨κ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

@chmanie κ°μ‚¬ν•©λ‹ˆλ‹€~

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰