如果使用异常处理程序不能执行中间件?
Can not execute middleware if using a exception handler?
当对我的 api 端点有错误请求时,wrap-cors 不会 return 访问控制 headers。我相信这是因为我正在使用一个异常处理程序,它可能会阻止来自 运行 的中间件。我想知道我如何仍然可以为此路由执行中间件并将 cors headers 附加到错误请求的响应中。
异常处理程序
(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)))
我决定附加我自己的 headers 而不是使用 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 headers。
wrap-cors 不会 return 访问控制 headers。我相信这是因为我正在使用一个异常处理程序,它可能会阻止来自 运行 的中间件。我想知道我如何仍然可以为此路由执行中间件并将 cors headers 附加到错误请求的响应中。
异常处理程序
(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)))
我决定附加我自己的 headers 而不是使用 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 headers。