如何将与AJAX请求相对应的错误传递给客户端并在客户端处理?

时间:2011-08-04 23:01:54

标签: jquery ajax django

我有以下表格供我的用户更改他们的电子邮件地址。

<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代码ajaxly发布到服务器:

$(".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后,需要验证新电子邮件是否已存在于数据库中(即电子邮件需要是唯一的)。假设服务器检测到重复的电子邮件,我不知道如何将错误传回客户端。我很想在json字典中添加一个条目“duplicate_email:true”并将其返回给客户端。我不知何故觉得这不是正确的做法。

请为此方案指出正确的方法。服务器应该如何将错误传递回客户端?如何在客户端捕获错误?感谢。

2 个答案:

答案 0 :(得分:10)

如果您想使用Right Way™,请提供服务RESTful。在这种情况下,适当的status code可能是“409 Conflict”,维基百科将其定义为“表示由于请求中的冲突(例如编辑冲突)而无法处理请求”。 (另见REST HTTP status codes for failed validation or invalid duplicate。)

因此,您的服务器输出“409 Conflict”标题,并在您的客户端中检查状态。 $ .post()不会这样做因为你只能注册成功处理程序,所以你需要使用$ .ajax()这样:

$.ajax({
  statusCode: {
    409: function() {
      alert('duplicate');
    }
  }
});

答案 1 :(得分:2)

最佳做法可能是返回这样的错误对象:

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

然后,您可以跟踪特定于您的应用程序的错误代码/消息列表。