製作 exception handlers

通常 API 請求後,伺服器端這邊可能會有找不到資料或是沒考慮到的狀況而噴 Error

而 grape 也有攔截 Error 的方法

這邊製作一個很常用的 Error 處理方式,然後在 base.rb 入口處 include 檔案,就可以做到 exception 的管理

建立檔案 touch app/api/api_v0/exception_handlers.rb

module ApiV0
  module ExceptionHandlers

    def self.included(base)
      base.instance_eval do

        # 只要是 grape validation 沒有過的 Error 都返回自定義狀態碼 1001
        rescue_from Grape::Exceptions::ValidationErrors do |e|
          rack_response({
            error: {
              code: 1001,
              message: e.message
            }
          }.to_json, e.status)
        end

        # 如果因為找不到數據 raise Error, 都返回 404 Not Found
        rescue_from ActiveRecord::RecordNotFound do
          rack_response({ 'message' => '404 Not found' }.to_json, 404)
        end

        # 任何不存在的路由都返回 404 Not Found
        route :any, '*path' do
          error!('404 Not Found', 404)
        end
      end
    end
  end

  class Error < Grape::Exceptions::Base
    attr :code, :text

    def initialize(opts={})
      @code    = opts[:code]   || 2000
      @text    = opts[:text]   || ''

      @status  = opts[:status] || 400
      @message = { error: { code: @code, message: @text } }
    end
  end

  class AuthorizationError < Error
    def initialize
      super code: 2001, text: 'Authorization failed', status: 401
    end
  end
end

在這隻檔案裡面可以看到, 1001 是自定義的錯誤碼給使用者參考,而 2001 是權限不足的自定義狀態碼

如果要創建更多 Error code,只需要在這隻檔案新增就行。

把 Exception 處理的部分也在 api/api_v0/base.rb 加上吧

module ApiV0
  class Base < Grape::API
    version 'v0', using: :path
    #...
    include ApiV0::ExceptionHandlers
    #...
  end
end

我們試試看打一個不存在的 url 會發生什麼事情?

在瀏覽器輸入 http://localhost:3000/api/v0/cccc

就會拿到我們返回的 "404 Not Found"

{"error":"404 Not Found"}
Copyright © NicLin 2019 all right reserved,powered by Gitbook該頁面生成時間: 2019-04-09 10:00:37

results matching ""

    No results matching ""