Как ошибка, соответствующая запросу AJAX, должна передаваться и обрабатываться на стороне клиента? - PullRequest
3 голосов
/ 05 августа 2011

У меня есть следующая форма для того, чтобы мои пользователи могли изменить свои адреса электронной почты.

<form enctype="multipart/form-data" id="email_change_form" method="post" action="/my_account/">
<table> 
<tr> 
  <td> 
    <label for="id_email">E-mail address</label>:
  </td> 
  <td> 
    <input name="email" value="a@a.com" maxlength="75" type="text" id="id_email" size="30" /> 
  </td> 
  <td class="error_email">
  </td> 
</tr> 
</table> 
<input type="hidden" name="form_id" value="email_change_form" /> 
</form>

После нажатия кнопки сохранения (чей код не показан) форма отправляется на сервер в следующем порядке:Код jQuery:

$(".save_button").click(function() {
    var $form = $("#email_change_form")
    url = $form.attr("action");

    $.post(url, $form.serialize(), 
      function(data) {
          //upon success, the server returns the new email (data.email) in a json dictionary. 
        },
        "json"
      );      
    }
  })

После того, как сервер получил POST, он должен убедиться, что новое электронное письмо еще не существует в базе данных (т. е. электронное письмо должно быть уникальным).Скажем, сервер обнаружил дубликат электронной почты, я не уверен, как сообщить об ошибке клиентской стороне.У меня возник соблазн добавить запись «duplicate_email: true» в словарь json и вернуть ее на стороне клиента.Я почему-то чувствую, что это неправильный подход.

Пожалуйста, посоветуйте правильный подход (ы) для этого сценария.Как сервер должен передать ошибку обратно клиентской стороне?И как должна быть зафиксирована ошибка на стороне клиента?Спасибо.

Ответы [ 2 ]

10 голосов
/ 05 августа 2011

Если вы хотите сделать это Правильным способом и торговать; сделайте свои услуги RESTful . В этом случае соответствующий код состояния , вероятно, является «409 Конфликт», который Википедия определяет как «Указывает, что запрос не может быть обработан из-за конфликта в запросе, такого как конфликт редактирования». (См. Также REST HTTP коды состояния для неудачной проверки или недопустимого дубликата .)

Итак, ваш сервер выводит заголовок "409 Conflict", а в вашем клиенте проверяет статус. $ .post () не сделает этого, так как вы можете зарегистрировать только обработчик успеха, поэтому вам нужно использовать $ .ajax () следующим образом:

$.ajax({
  statusCode: {
    409: function() {
      alert('duplicate');
    }
  }
});
2 голосов
/ 05 августа 2011

Лучше всего возвращать объект ошибки, подобный этому:

{error:true,
 errorCode:123,
 errorMessage:"Duplicate Email",
 errorDescription:"The email you entered (john@johndoe.com) already exists"
}

Затем вы можете отслеживать список кодов ошибок / сообщений, относящихся к вашему приложению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...