clojure - Clojure ring-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 的回答是正确的,但是请注意,我必须在我的 dev-handler 定义的末尾删除 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)))
推荐阅读
- c++ - 调用 (list 和 push_front) 没有匹配的函数
- bash - 如何在逗号分隔符和自动增量之前替换数字
- android-studio - 将我的 Android Studio 项目连接到 Firebase 时出错
- alfresco - Activiti Timer 任务电子邮件 任务提醒通知
- sql - 我怎样才能找到在注册成为商店会员的前 90 天内进行交易的客户百分比?
- delphi - 如何释放通用 TList
? - javascript - 从 JS 函数到 NodeJS
- powerbi - DAX LOOKUPVALUE 返回“未定义”而不是空白?
- excel - 如何在 VBA 中的 Evaluate 函数中添加分隔符?
- jsf - 如何在我的代码中实现 primefaces 延迟加载