【问题标题】:Clojure ring-cors/wrap-cors setupClojure ring-cors/wrap-cors 设置
【发布时间】:2021-01-05 15:55:02
【问题描述】:

我正在使用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) 的源代码,错误似乎来自trying to apply (hash-map) to my cors-policy map。似乎我无法传递映射定义,而是在调用(wrap-cors)时必须显式传递键/值。有什么想法可以解决这个问题?

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

编辑: cfrick 的回答是正确的,但是请注意,我必须在我的 dev-handler 定义的末尾删除 shadow-cljs'(push-state/handle)处理程序设置工作。

【问题讨论】:

    标签: clojure cors clojurescript


    【解决方案1】:

    包装器使用一种“模式”,有时会看到并专注于 “人类消费”的功能。它需要“休息”的 参数并将它的对转换为映射。这已经是“嗯” 对人类来说,对机器完全不利(例如作为参数传递)。

    你必须像这样调用它:

    (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))
    

    但是随着线程宏-&gt;的使用,这变得更难了 现在(-&gt; 只是一个宏,生成的代码将是(apply $handler wrap-cors ...),这是无意的。

    所以此时我会添加我自己的defn,它只需要处理程序 再次。例如。像

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-20
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 2018-09-27
      • 2018-06-01
      相关资源
      最近更新 更多