【问题标题】:Can not execute middleware if using a exception handler?如果使用异常处理程序不能执行中间件?
【发布时间】:2019-04-06 16:44:54
【问题描述】:

wrap-cors 在对我的 api 端点有错误请求时不返回访问控制标头。我相信这是因为我使用的异常处理程序可能会阻止中间件运行。我想知道我如何仍然可以执行此路由的中间件并将 cors 标头附加到错误请求的响应中。

异常处理程序

(defn- bad-request-handler
  "Handles bad requests."
  [f]

  (f
    (ring/response {:status "bad request"})))

应用程序

(def app
  (api
    {:exceptions {:handlers
                          {::ex/request-validation (bad-request-handler response/bad-request)}}}

    (POST "/" [] :body [item {(schema/required-key :item) schema/Bool}]
             :middleware [#(wrap-cors % :access-control-allow-origin [#".*"]
                                      :access-control-allow-methods [:post])]

             :responses {200 {:description "ok"}
                         400 {:description "bad request"}} item)))

【问题讨论】:

    标签: clojure cors compojure compojure-api


    【解决方案1】:

    我决定附加我自己的标题而不是使用 r0man/ring-cors。 我可以通过从请求中检索:request-method 值来确定Access-Control-Allow-Methods 的内容。 但是,这假设错误的请求处理程序只会被有效路由调用。

    (defn- append-cors
      "Allow requests from all origins"
      [methods]
    
      {"Access-Control-Allow-Origin"  "*"
       "Access-Control-Allow-Methods" methods})
    
    
    (defn- bad-request-handler
      "Handles bad requests."
      [f]
    
      (fn [^Exception e data request]
        (->
          (f request)
          (update-in [:headers] merge (->
                                        (request :request-method)
                                        (name)
                                        (clojure.string/upper-case)
                                        (append-cors)))
          (assoc :body {:status "bad request"}))))
    

    我仍然不确定为什么只有在允许请求时才添加 cors 标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-10
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多