Clojurering-cors/wrap-cors设置

我正在使用ring-cors并尝试为 (wrap-cors) 函数传递 cors-policy。这是我的代码的样子:

(def cors-policy
  {:access-control-allow-origin [#"http://localhost:8080"]
   :access-control-allow-methods [:get :put :post]})

(def dev-handler (-> #'japi/routes
                     wrap-reload
                     wrap-params
                     (wrap-cors cors-policy) ;; <- Here
                     wrap-json-response
                     (wrap-defaults api-defaults)
                     push-state/handle))

这会导致错误:

没有为密钥提供值:{:access-control-allow-origin #{"http://localhost:8080"}, :access-control-allow-methods #{:get :post :put}}

查看(wrap-cors)的源代码,似乎错误来自尝试将 (hash-map) 应用于我的 cors-policy map。似乎我无法传递地图定义,而是在调用 (wrap-cors) 时必须显式传递键/值。有什么想法可以解决这个问题吗?

我已经(apply hash-map cors-policy)在 repl 中尝试过并且效果很好,但是当(wrap-cors identity cors-policy)再次传递这样的虚拟处理程序时会导致相同的错误。

编辑: cfrick 的答案是正确的,但请注意,我必须在我的开发处理程序定义的末尾删除 shadow-cljs'(推送状态/句柄)处理程序,以便我的设置工作。

回答

包装器使用有时会看到的“模式”,并专注于功能的“人类消费”。它接受参数的“其余”并将其成对转换为映射。这对人类来说已经是“meh”了,而对机器来说却是非常糟糕的(例如作为参数传递)。

你必须像这样调用它:

(wrap-cors $handler :a 1 :b 2)

所以从这里最简单的方法是:

(def cors-policy
  [:a 1
   :b 2])

(apply wrap-cors $handler cors-policy)

或者,如果您想坚持使用地图(恕我直言,这是个好方法),您必须事先将地图展平。例如

(apply wrap-cors $handler (into [] cat cors-policy))

但是随着线程宏的使用,->这现在变得更难做到(->只是一个宏,结果代码将(apply $handler wrap-cors ...)是意外的。

所以在这一点上,我会添加我自己的defn,只是再次接受处理程序。例如类似的东西

(defn cors-wrapper
  [handler config-map]
  (apply wrap-cors handler (into [] cat config-map)))


以上是Clojurering-cors/wrap-cors设置的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>