Сервер отвечает с ответом отладки по умолчанию вместо поднятого ответа исключения - PullRequest
0 голосов
/ 15 марта 2019

Внутри механизма с API, при запросе API выдается исключение, но ответ сервера не использует указанный ответ, а вместо этого выводит ответ отладки по умолчанию (в производстве).

Iможет подтвердить, что исключение перехвачено контроллером:

Started GET "/api_v2/admin/submissions?system_id=123&spt_id=123" for 

127.0.0.1 at 2019-03-15 10:04:37 -0400
Processing by ApiV2::Admin::SubmissionsController#show as JSON
  Parameters: {"system_id"=>"123", "spt_id"=>"123"}

[3, 12] in /....../emp_api_v2/app/controllers/emp_api_v2/application_controller.rb
    3: 
    4:     before_action :doorkeeper_authorize!
    5: 
    6:     rescue_from ::ActiveRecord::RecordNotFound do |e|
    7:       byebug
=>  8:       response(:standard_error, 500, "Hello World")
    9:     end
   10: 
   11:     def doorkeeper_unauthorized_render_options(error: nil)
   12:       { json: { message: "Not authorized" }, status: 403 }
(byebug) cont
Completed 500 Internal Server Error in 5220ms (ActiveRecord: 0.0ms)

ActiveRecord::RecordNotFound - Couldn't find Emp::System with 'id'=123:

Ожидается, что сервер ответит 500 Ошибка сервера, а не трассировка стека ошибок отладки.

Почему существует два ответа, хотяконтроллер ловит исключение и запускает метод ответа.

ПРИМЕЧАНИЕ : это происходит в dev и prod!Сервер сначала отвечает 500 (мой ответ catch), а затем - трассировкой стека и 404 (так как это источник ошибки и правильное исключение).Это нарушает мои тесты, так как предыдущий ответ был 500. Я не смог вернуть свой сервер к старому поведению: переустановка ruby, переустановка rails + все гемы + откат всех изменений в репо.Такое поведение внешне устанавливается с помощью переменной ENV или чего-то еще.

Буду благодарен за любую информацию.

Редактировать: Контроллер приложения (api) выглядит следующим образом:

module ApiV2
  class ApplicationController < ActionController::API

    before_action :doorkeeper_authorize!

    rescue_from ::ActiveRecord::RecordNotFound do |e|
      response(:standard_error, 500, "Hello World")
    end

    def doorkeeper_unauthorized_render_options(error: nil)
      { json: { message: "Not authorized" }, status: 403 }
    end
  end
end

Редактировать 2 : Мне удалось получить правильный ответ, поместив вызов в блок спасения.Этот код приведет к большому количеству блоков начала / спасения, хотя каждый из них имеет определенное сообщение об ошибке.

    begin
      system =   Emp::System.find(sys_id)
    rescue
      render json: { status: 500, content: "Specific Error msg" } and return
    end

Первоначально у меня был следующий метод:

def handle_exception(message, &block)
  begin
    block.call
  rescue Exception => e
    render json: { message: message }, status: 500 and return
  end
end

Этоприведет к двойной ошибке рендеринга, поскольку он не возвращается из метода верхнего уровня, а из блока.

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