首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭合环-cors/包-cors设置

闭合环-cors/包-cors设置
EN

Stack Overflow用户
提问于 2021-01-05 15:55:02
回答 1查看 448关注 0票数 3

我正在使用环棒,并试图为(环绕-cors)函数传递cors策略。这就是我的代码的样子:

代码语言:javascript
复制
(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‘(推态/句柄)处理程序,这样我的设置才能正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-05 17:14:04

包装器使用一种“模式”,这种模式有时会被看到,并且集中在函数的“人类消费”上。它获取参数的"rest“,并将这些参数的对转换为地图。这对于人类来说已经是"meh“了,对机器来说也是非常糟糕的(例如,将其作为论据传递)。

你必须这样做:

代码语言:javascript
复制
(wrap-cors $handler :a 1 :b 2)

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

代码语言:javascript
复制
(def cors-policy
  [:a 1
   :b 2])

(apply wrap-cors $handler cors-policy)

或者,如果你想坚持使用地图(IMHO是一个好的方法),你必须事先把地图压平。例如:

代码语言:javascript
复制
(apply wrap-cors $handler (into [] cat cors-policy))

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

因此,在这一点上,我将添加我自己的defn,它只是再次接受处理程序。例如,类似于

代码语言:javascript
复制
(defn cors-wrapper
  [handler config-map]
  (apply wrap-cors handler (into [] cat config-map)))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65582216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档