Angularjs $ resource响应中的错误代码错误

时间:2014-02-11 18:58:20

标签: javascript angularjs flask http-status-code-404 http-status-code-401

我有一个函数,通过进行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引起的跨域请求问题。请参阅下面的答案

1 个答案:

答案 0 :(得分:0)

答案结果证明是后端问题,这是在Flask中完成的。装饰器用于正确设置Access-Control-Allow-Origin标头。不幸的是,装饰器不适用于使用abort()函数完成的错误。解决这个问题的方法是使用this decorator,并设置如下:

if verify(req):
    do stuff ...
else:
    return jsonify({'error': 401}), 401

如果错误被设置为带有错误代码的json返回,则装饰器将到达它。