【问题标题】:How should error corresponding to an AJAX request be passed to and handled at the client-side?与 AJAX 请求对应的错误应该如何传递到客户端并在客户端进行处理?
【发布时间】:2011-08-04 23:01:54
【问题描述】:

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

<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”并将其返回给客户端。不知何故,我觉得这不是正确的方法。

请针对这种情况提出正确的方法。服务器应该如何将错误传递回客户端?以及如何在客户端捕获错误?谢谢。

【问题讨论】:

  • `我很想添加一个条目“duplicate_email:true”`这正是您需要做的:)

标签: jquery ajax django


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的解决方案。然而,对于我正在工作的原型来说,RESTful 有点矫枉过正。话虽如此,这种方法绝对是我稍后会考虑的事情。干杯。
  • 当然。与其他技术相比,它绝对是更多的前期设计和 API 争论,并且对于快速原型并不总是有意义。
【解决方案2】:

最好的做法可能是像这样返回一个错误对象:

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

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

【讨论】:

  • 感谢您的解决方案。由于我目前正在研究一个原型,因此我决定使用您的简化版本 - 有一个带有 errorMessasge 字段的错误对象。干杯。
猜你喜欢
  • 1970-01-01
  • 2019-06-03
  • 2011-09-27
  • 2019-09-05
  • 1970-01-01
  • 2013-05-30
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多