我正在使用环棒,并试图为(环绕-cors)函数传递cors策略。这就是我的代码的样子:
(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))这将导致一个错误:
没有为键提供值:{:访问-控制-允许-源#{"http://localhost:8080"},:访问控制-允许-方法#{:get :post :put}
查看(包裹-保龄球)的源代码,看起来错误来自于尝试将(散列映射)应用于我的cors策略映射。似乎我不能传递一个映射定义,但是在调用时,我必须显式地传递键/值(包-cors)。有什么办法解决这个问题吗?
我已经在repl中尝试过(apply hash-map cors-policy),这很好,但是当传递一个虚拟处理程序(如(wrap-cors identity cors-policy) )时,这再次导致同样的错误。
编辑:的答案是正确的,但是请注意,我必须在开发处理程序定义的末尾删除影子cljs‘(推态/句柄)处理程序,这样我的设置才能正常工作。
发布于 2021-01-05 17:14:04
包装器使用一种“模式”,这种模式有时会被看到,并且集中在函数的“人类消费”上。它获取参数的"rest“,并将这些参数的对转换为地图。这对于人类来说已经是"meh“了,对机器来说也是非常糟糕的(例如,将其作为论据传递)。
你必须这样做:
(wrap-cors $handler :a 1 :b 2)所以从这里开始最简单的方法是:
(def cors-policy
[:a 1
:b 2])
(apply wrap-cors $handler cors-policy)或者,如果你想坚持使用地图(IMHO是一个好的方法),你必须事先把地图压平。例如:
(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)))https://stackoverflow.com/questions/65582216
复制相似问题