Как вы обрабатываете ошибки из вызовов AJAX?

Скажем, у меня есть следующий вызов jQuery AJAX:

$.ajax({
   type: "POST",
   url: "MyUrl",
   data: "val1=test",
   success: function(result){
        // Do stuff
   }
 });

Теперь, когда этот вызов AJAX сделан, я хочу, чтобы серверный код выполнялся с помощью нескольких проверок обработки ошибок (например, пользователь все еще зарегистрирован, имеют ли они разрешение на использование этого вызова, являются ли данные действительными и т.д.). Если обнаружена ошибка, как я могу вывести это сообщение об ошибке на клиентскую сторону?

Моя первоначальная мысль заключалась в возврате объекта JSON с двумя полями: error и errorMessage. Эти поля затем будут проверяться в вызове jQuery AJAX:

$.ajax({
   type: "POST",
   url: "MyUrl",
   data: "val1=test",
   success: function(result){
       if (result.error == "true") 
       {
           alert("An error occurred: " & result.errorMessage);
       }
       else 
       {
           // Do stuff
       }
   }
 });

Для меня это немного неуклюже, но это работает. Есть ли лучшая альтернатива?

Ответ 1

Лично у меня есть аналогичный код для следующего кода в моей библиотеке.

$.ajaxSetup({
    error: function(xhr){
        alert('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText);
    }
});

jQuery docs Ajax/jQuery.ajaxSetup

Лучший способ выпустить эту ошибку со стороны сервера (с использованием php) на стороне клиента - отправить заголовок через запрос Ajax где-то в 400 (что всегда связано с ошибками). Как только запрос Ajax получит это, он вызовет функцию ошибки. Это также означает, что вам не нужно определять ошибку: вызовите каждый вызов $.ajax.

header('HTTP/1.0 419 Custom Error');

Цитата из информация заголовка w3.org

Ошибка 4xx, 5xx Коды 4xx предназначены для случаев, когда клиент, похоже, ошибся, а коды 5xx для случаев, когда сервер знает, что сервер ошибся. Невозможно отличить эти случаи в целом, поэтому разница только информационная. Раздел тела может содержать документ, описывающий ошибку в удобочитаемой форме человека. Документ находится в формате MIME и может быть только в text/plain, text/html или один для форматов, указанных как приемлемый в запросе.

Ответ 2

$.ajax({
   type: "POST",
   url: "MyUrl",
   data: "val1=test",
   success: function(result){
        // Do stuff
   },
   error: function(request,status,errorThrown) {
        // There been an error, do something with it!
        // Only use status and errorThrown.
        // Chances are request will not have anything in it.
   }
 });

Ответ 3

Не работает ли функция jQuery ajax еще один параметр в конце, обратный вызов для неудачных вызовов? Если это так, просто добавьте fail:function(...){..} после обратного вызова успеха.

Ответ 4

Возвращает код ошибки на стороне сервера, используя ошибку HTTP, которая наилучшим образом соответствует тому, что является ошибкой. Затем используйте обратный вызов ошибки. Это также позволит вам показывать ошибки, данные вашим веб-сервером.

Ответ 5

Это довольно поздно, чтобы ответить на этот вопрос, но я думаю, что это будет полезно для кого-то, использующего es6 и jquery 2.2.

Я обычно следую этому (отложенный подход) в своем коде

sendAjaxRequest(URL, dataToSend) {
    return $.ajax({
        type        : 'POST',
        url         : URL,
        data        : JSON.stringify(dataToSend),
        dataType    : 'json'
    }).fail((responseData) => {
        if (responseData.responseCode) {
            console.error(responseData.responseCode);
        }
    });
},

Я приложил отложенный метод fail, который будет вызываться, если произойдет некоторая ошибка. Это альтернативная конструкция для опции обратного вызова ошибки. Метод .fail() заменяет устаревший метод .error() в последнем jquery.

Далее с места вызова sendAjaxRequest я использую then jquery callback

sendAjaxRequest(URL, dataToSend)
.then(
     (success) => {
     },
     (error) => {
     }
);

Он будет вызывать функцию успеха или ошибки на основе ответа, полученного от сервера.