【问题标题】:Should I worry about this 422 (Unprocessable Entity) error? (Rails & Devise)我应该担心这个 422 (Unprocessable Entity) 错误吗? (导轨和设计)
【发布时间】:2016-06-15 08:16:21
【问题描述】:

我正在使用 ajax 提交我的注册表单。

详细信息正确时正确提交的表单。如果细节错误,我也能够正确捕获错误。但是,如果详细信息有误,我也可以在控制台日志中看到 POST http://localhost:3000/users 422 (Unprocessable Entity) 错误消息:

我的问题是,我应该担心这个错误吗?或者这是正常的? 如果这不正常,应该如何正确处理?

谢谢!

############################### 更新########### ###################

来自终端的错误消息:

Started POST "/users" for ::1 at 2016-06-15 09:20:20 +0100
Processing by RegistrationsController#create as JSON
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"0D1qSK8IfbuefQ0bwEdKQFD+6WZ8XJtCnl2FZ6Nln9khLtv6qYCmoTKhwBFkVIJdYXSRQJ4e+9QAAdJ5UJzukQ==", "user"=>{"first_name"=>"John", "last_name"=>"Doe", "email"=>"ryzalyusoff@gmail.com", "password"=>"[FILTERED]"}, "commit"=>"Sign up"}
   (0.2ms)  BEGIN
  User Exists (0.6ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY 'ryzalyusoff@gmail.com' LIMIT 1
   (0.2ms)  ROLLBACK
Completed 422 Unprocessable Entity in 93ms (Views: 0.4ms | ActiveRecord: 1.1ms)

注册控制器:

class RegistrationsController < Devise::RegistrationsController
  respond_to :json

  def create
    super
  end
end

application.js:

$(function(){

  $("form#ajax_signup").submit(function(e){
     e.preventDefault(); 
     var user_info = $(this).serializeObject();
     console.log("About to post to /users: " + JSON.stringify(user_info));
     $.ajax({
       type: "POST",
       url: "http://localhost:3000/users",
       data: user_info,
       success: function(json){
         console.log("The Devise Response: " + JSON.stringify(json));
       },
       error: function(xhr) { 

            var errors = jQuery.parseJSON(xhr.responseText).errors; 

            for (messages in errors) { 
                error_messages =  messages + ' ' + errors[messages];

                console.log(error_messages);
            } 

       }, 
       dataType: "json"
     });
  });

});

【问题讨论】:

  • 您能否将其余的相关日志条目以及负责的控制器方法(包括正在使用的任何强参数方法)放入其中。
  • 是的,当然你应该关心,如果这个 POST 操作由于某种原因(“电子邮件地址被占用”)失败,当然会返回一些 4xx 响应。你能指望什么?您只想进行客户端验证吗?即便如此,无论如何您都应该处理服务器发送的错误响应......
  • @Matt 我已经发布了有关该问题的更多详细信息
  • @matthias 是的,稍后我计划将收到的错误显示给用户的浏览器。但我只是想知道 422 错误是否应该出现在控制台上。因为我在Airbnb之类的网站上看过,表单失败时检查控制台,但是没有这样的422错误。
  • @ryzalyusoff 好的,我明白了。答案是:发送请求和接收响应码不是 2xx 是绝对合法的。只要您处理这些响应和对用户的五个反馈,一切都很好。用户不应该关心 XHRequests 的网络状态码。不同错误类型的不同状态代码就像 REST API 的工作方式一样,也是 REST 客户端可以依赖的最小合约的一部分。

标签: javascript ruby-on-rails json ruby-on-rails-4 devise


【解决方案1】:

不,您不必担心控制台中的 422,此红色警告不会破坏您的 javascript 代码。 但是这个错误可以在你的 javascript 代码中为你提供简单的验证处理,比如:

$('#form').on('ajax:error', 
  function () { return 'handle me'; }
);

【讨论】:

  • 啊,是的。我只是想知道,因为当我检查像 Airbnb 这样的网站(我相信他们使用 AJAX 来处理他们的注册表单)时,当表单失败时,没有 422 错误或任何其他错误。他们不应该假设像我一样显示相同的错误吗?或者有办法正确处理这件事
  • 有两种方法来处理验证:第一种:422 和第二种:200 (ok) + errors: { name: 'cant be blank' } 在正文中。第一种方式你可以检查状态码,第二种方式你应该检查error key存在上的body
  • @itsnikolay 这是真的,可能一些大型服务会这样处理它(加上做大量预取数据来检查可用性,做一些“预测性”客户端验证)。但尽管如此,如果客户端发送的数据无法以可以成功创建或更新实体的方式(POST、PUT、PATCH... )。
  • 检查 422 也是更好的方法,尤其是当服务器可以返回 500 多个带有奇怪 html 正文的错误时。我选择使用422方式
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2018-07-29
  • 2019-04-26
  • 1970-01-01
相关资源
最近更新 更多