0

У меня есть функция, которая перечисляет базы данных, подключенные к SQL-серверу, путем вызова API.

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, не отправляя токен, который я должен проверить, и получаю ошибку 401 в соответствии с консолью Firefox. Это ожидаемое поведение, когда 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: Проблема оказалась проблемой междоменного запроса, вызванной API-интерфейсом Flask, который я использовал для запуска приложений. См. Мой ответ ниже

+0

angularjs не преобразует 401 в 404. Проверьте ваш запрос с сервера. также проверьте ответ на вкладке сети браузера. – allenhwkim

+0

Оба говорят 401, как и консоль Firefox. –

+0

Что говорят другие браузеры для кода состояния? –

ответ

0

Ответ оказывается проблемой с задним концом, который был выполнен в Flask. Декоратор был использован для правильной настройки заголовков Access-Control-Allow-Origin. К сожалению, декоратор не относится к ошибкам, которые выполняются с помощью функции abort(). Способ обойти это использовать this decorator, и установить вещи, как это:

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

Если ошибка установлена ​​в качестве JSon возвращения с кодом ошибки, декоратор достигнет его.

Смежные вопросы