角度のものは私を狂っている! thaのアプリがベアラ認証を使用し、それはほとんど動作します。この角度defereは未定義
function errorInterceptor($injector, $log, $location) {
var inFlight = null;
var authInterceptorServiceFactory = {};
var _request = function (config) {
config.headers = config.headers || {};
var oauthToken = $injector.get('oauthService').getAuthorizationHeader();
if (oauthToken) {
config.headers.Authorization = oauthToken;
}
return config;
}
var _responseError = function (rejection) {
debugger
var deferred = $injector.get('$q').defer();
switch(rejection.status){
case 401:
console.log('401');
if(inFlight == null){
var authService = $injector.get('oauthService');
inFlight = authService.refreshToken() //this is just a $http call
}
inFlight
.then(function (response) {
_retryHttpRequest(rejection.config, deferred)
.success(function (result) {
deferred.resolve(result);
})
.error(function(err, status) {
deferred.reject(err);
})
.finally(function() {
inFlight = null;
});
$injector.get('oauthService').setLocalStorageData(response.data);
},
function (err, status) {
$injector.get('oauthService').logOut();
});
break;
}
return deferred.promise;
}
var _retryHttpRequest = function (config, deferred) {
var $http = $http || $injector.get('$http');
return $http(config);
}
authInterceptorServiceFactory.request = _request;
authInterceptorServiceFactory.responseError = _responseError;
return authInterceptorServiceFactory;
}
ようerrorInterceptorがあり、第一401応答はその後、後続のすべての要求は新しいトークンで再送信された「refreshToken」要求を発行します。私が直面してる 問題が
deferred.resolve(result);
ラインであるとの結果が予想されるオブジェクトですが、約束の関数が呼び出されたときにその引数が定義されていません!
約束機能
sidebarService.getMenu()
.success(sidebarReady)
.error(sidebarReadyError);
function sidebarReady(items) {
//when errorInterceptor catches the error
//and re-sends, when it resolves this funciton, argument is undefined
//
}
誰も助けてくださいことはできますか? ありがとう
@Nekudotayim おかげで私は表示されません。成功したコールバックとして機能を設定しているだけで、何も渡されません。 –
これはあなたの質問には関係ありませんが、あなたのrefreshtokenをlocalstorageに保存することはセキュリティ上の責任であるかもしれないことに注意してください。 JavaScriptによってアクセスできるため、潜在的なXSS攻撃を受ける可能性があります。だから、もしそれをlocalstorageに保存したいのであれば、あなたのコードは一切なく、あなたのライブラリのどれもがXSSの影響を受けていないことを絶対に確かめる必要があります。 –
[遅延反パターン]を避けてください(http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)!例えば、 'inFlight'があなたの拒否を拒否した場合、決済は決して決済されません。 – Bergi