我有以下功能来获取登录用户。我不得不说我已经复制了教程中的代码 - 因此我不确切知道在后台发生了什么。
几分钟(20分钟)后没有请求令牌无效,如果调用getCurrentUser()
我得到一个白色屏幕(来自后端的HTTP 401) - 我的错误拦截器$httpProvider.interceptors.push(errorInterceptor);
未被调用
我现在的问题是如何处理这个案子。是否有可能在getCurrentUser()中强制errorInterceptor- invokation或如何处理它?</ p>
function getCurrentUser() {
var deferred = $q.defer();
if(currentUser){
deferred.resolve(currentUser);
} else {
getCurrentUserFromAPI().success(function(data) {
if(data) {
currentUser = data;
return deferred.resolve(currentUser);
}
}).error(function(data) {
var token = authTokenService.getToken();
if(token) {
authTokenService.deleteToken();
}
return deferred.reject(data);
});
}
return deferred.promise;
}
[编辑]
这是我在底部的拦截器,我认为当后端响应错误时总是会调用errorResponse函数 - 例如HTTP 401,但是当调用函数 getCurrentUser 并且HTTP 401是来自服务器的响应时,不会调用此方法 - 因此我得到一个白屏。
其实我不知道该怎么做以防止这个白屏? 在这种情况下,我能做些什么吗?
(function() {
'use strict';
angular
.module('myProject.error')
.config(configure);
configure.$inject = ['$httpProvider'];
function configure($httpProvider) {
$httpProvider.interceptors.push(errorInterceptor);
////////////
function errorInterceptor($injector, $q, $location) {
var interceptor = {
responseError: responseError
};
return interceptor;
////////////
function responseError(response) {
alert('responseError')
switch(response.status) {
case ...
}
return $q.reject(response);
}
}
}
})();
答案 0 :(得分:0)
当您的deffered
方法中包含空数据时,您似乎无法解析.success
。
试试这个:
function getCurrentUser() {
if (currentUser) return $q.when(currentUser);
return getCurrentUserFromAPI(
).then(function(response) {
if (response.data) {
currentUser = response.data;
return currentUser;
} else {
currentUser = null;
throw null;
}
},function(error) {
var token = authTokenService.getToken();
if (token) {
authTokenService.deleteToken();
};
throw error;
});
};
};
弃用通知
.success
服务现已弃用.error
和$http
方法。而是使用.then
,.catch
和.finally
方法。有关详细信息,请参阅AngularJS $http Service API Reference。
答案 1 :(得分:0)
我已添加此代码:
msiexec.exe /qn /x "Borland CaliberRM 10.1.msi"
然后它工作到目前为止(exept我重新加载浏览器视图 - 然后我被重定向到登录页面)但实际上我不知道 resp。$$ state.status 是什么以及为什么它也是0.而且我也不知道为什么不调用函数(错误)或函数(成功) - 当我在浏览器中成功调试并且错误回调不是调用。 也许有人确实对这个问题有了答案。
if(resp.$$state.status == 0) {
$location.path('/signin')
}