我有一个函数,通过进行API调用来列出附加到SQL服务器的数据库。
function dbList(resource, args, scope, server){
// Recieves a list of DBs from the API and adds it to the scope
scope.loadingResponse = true;
resource('http://localhost:1000/apiv1/servers/:server/databases',
{server: server}).get(args).$promise.then(function (result) {
scope.databases = result.databases;
scope.loadingResponse = false;
}, function(error){
console.log(JSON.stringify(error));
errorHandler(scope, error)
})
}
从我的控制器调用它,如:
dbList($resource, args, $scope, 'SERVER1');
它将遇到的任何错误传递给我的错误处理程序,它会对它们进行评估:
function errorHandler(scope, error){
// Displays the error message and ends the loading animation
var err_code = error.status;
var err_message = 'Error Code ' + error.status + ': ';
console.log(JSON.stringify(error))
if (err_code == 401){
err_message += 'Unauthorized. Cookie expired or nonexistent.';
}
else if (err_code == 400) {
err_message += 'Missing parameter. Ensure all necessary fields are filled'
}
else if (err_code == 404) {
err_message += 'Resource not found. Ensure that it exists.'
}
else if (err_code == 405) {
err_message += 'Method not allowed. This could be caused by XHR Cross Domain Option requests.'
}
else if (err_code == 409) {
err_message += 'The Resource you wish to use is in use. Ensure that there is no name conflict with an attached database.'
}
scope.loadingResponse = false;
scope.error = err_message;
}
我正在调用API而不提交我必须验证的令牌,并且根据Firefox控制台获得401错误。这是API在没有令牌的情况下访问时的预期行为。所以我希望将$ scope.error设置为Error Code 401: Unauthorized. Cookie expired or nonexistent.
但是,我得到的是Error Code 404: Resource not found. Ensure that it exists.
Firefox控制台显示:
[13:39:20.419] GET http://localhost:1000/apiv1/servers? [HTTP/1.0 401 UNAUTHORIZED 5ms]
[13:39:20.413] "{"data":"","status":404,"config":{"transformRequest":[null],"transformResponse":[null],"method":"GET","url":"http://localhost:1000/apiv1/servers","params":{},"headers":{}}}"
angular.js如何以及为什么将我的401转换为404,以及如何访问正确的状态代码?
ETA: 问题原来是由我用来运行东西的Flask API引起的跨域请求问题。请参阅下面的答案
答案 0 :(得分:0)
答案结果证明是后端问题,这是在Flask中完成的。装饰器用于正确设置Access-Control-Allow-Origin
标头。不幸的是,装饰器不适用于使用abort()
函数完成的错误。解决这个问题的方法是使用this decorator,并设置如下:
if verify(req):
do stuff ...
else:
return jsonify({'error': 401}), 401
如果错误被设置为带有错误代码的json返回,则装饰器将到达它。