Clojure ring-cors/wrap-cors 设置
Clojure ring-cors/wrap-cors setup
我正在使用 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))
这会导致错误:
No value supplied for key: {:access-control-allow-origin
#{"http://localhost:8080"}, :access-control-allow-methods #{:get :post :put}}
正在查看 (wrap-cors) it looks like the error is coming from trying to apply (hash-map) to my cors-policy map 的源代码。似乎我无法传递地图定义,但我必须在调用 (wrap-cors) 时显式传递 keys/values。有解决此问题的想法吗?
我已经在 repl 中尝试了 (apply hash-map cors-policy)
并且工作正常,但是当传递一个虚拟处理程序(例如 (wrap-cors identity cors-policy)
时,这再次导致相同的错误。
编辑: cfrick 的回答是正确的,但请注意,我必须在我的开发处理程序定义让我的设置工作。
包装器使用了一种有时会看到并着重于
“人类消费”的功能。它需要“休息”的
参数并将其成对转换为映射。这已经是“嗯”了
对人类来说,对机器来说是非常糟糕的(例如作为参数传递)。
你必须这样调用它:
(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)))
我正在使用 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))
这会导致错误:
No value supplied for key: {:access-control-allow-origin #{"http://localhost:8080"}, :access-control-allow-methods #{:get :post :put}}
正在查看 (wrap-cors) it looks like the error is coming from trying to apply (hash-map) to my cors-policy map 的源代码。似乎我无法传递地图定义,但我必须在调用 (wrap-cors) 时显式传递 keys/values。有解决此问题的想法吗?
我已经在 repl 中尝试了 (apply hash-map cors-policy)
并且工作正常,但是当传递一个虚拟处理程序(例如 (wrap-cors identity cors-policy)
时,这再次导致相同的错误。
编辑: cfrick 的回答是正确的,但请注意,我必须在我的开发处理程序定义让我的设置工作。
包装器使用了一种有时会看到并着重于 “人类消费”的功能。它需要“休息”的 参数并将其成对转换为映射。这已经是“嗯”了 对人类来说,对机器来说是非常糟糕的(例如作为参数传递)。
你必须这样调用它:
(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)))