首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请求映射传递给Compojure处理程序中的匿名函数

请求映射传递给Compojure处理程序中的匿名函数
EN

Stack Overflow用户
提问于 2016-04-16 12:47:54
回答 1查看 170关注 0票数 1

通过使用环-clojure公司制以及环臣wrap-json-body中间件编写一个简单的REST服务器,我已经学习了Clojure两天。

到目前为止,我已经:

包含用户的向量users (有几个默认用户):

代码语言:javascript
复制
(def users [{:id 0 :username "aname"}
            {:id 1 :username "anothername"}])

一个函数(表单?) save-user,它接受一个映射(用户)并查找具有相同用户名的现有用户。如果用户名可用,则在返回HTTP201之前,重写users向量以包含新用户。如果使用用户名,我只需返回HTTP 400:

代码语言:javascript
复制
(defn save-user [user]
  (prn users)
  (if
    (not-any? #(= (:username %) (:username user)) users)
    (fn [request]
      (def users (conj users user))
      (status
        (response (str "Saved user with username: " (:username user)))
        201))
    (status
      (response (str "User with username '" (:username user) "' already exists"))
      400)))

POST /users的一种路由,它用接收到的映射调用save-user

代码语言:javascript
复制
(defroutes app-routes
       (POST "/users" request (save-user (:body request))))

我认为这并不重要,但中间件的应用如下:

代码语言:javascript
复制
(def app
  (-> app-routes
      (wrap-cors :access-control-allow-origin "*" :access-control-allow-methods "*")
      (wrap-json-response)
      (wrap-keyword-params)
      (wrap-json-body {:keywords? true :bigdecimals? true})
      (wrap-defaults (assoc site-defaults :security false))))

我的问题是:

无论出于什么原因,整个request映射都被传递给作为then传递到if中的函数。印刷:

代码语言:javascript
复制
  (if
    (not-any? #(= (:username %) (:username user)) users)
    (fn [request]
      (prn request))
    ...

..。给我这个:

代码语言:javascript
复制
{:ssl-client-cert nil, :cookies {}, :remote-addr "0:0:0:0:0:0:0:1", :params {}, :flash nil, :route-params {}, :headers {"host" "localhost:3000", "accept" "*/*", "content-length" "42", "content-type" "application/json", "user-agent" "curl/7.43.0"}, :server-port 3000, :content-length 42, :form-params {}, :compojure/route [:post "/users"], :session/key nil, :query-params {}, :content-type "application/json", :character-encoding nil, :uri "/users", :server-name "localhost", :query-string nil, :body {:username "testusername", :password "testpassword"}, :multipart-params {}, :scheme :http, :request-method :post, :session {}}

如果我将匿名函数作为if的else传递,也会发生同样的情况。但是,当我只传递(status ...)时,并没有发生任何错误,就像上面的代码中一样。

据我所知,request映射不应该在save-user中可用,因为它不是作为参数传递的。为什么它被传递给我的匿名函数,有没有任何方法可以简单地忽略它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-16 18:43:06

save-user中,您将返回一个接受请求并返回响应(处理程序)的函数。

我想您应该直接返回响应。只需将(fn [request]替换为(do,将多个表达式包装在一个表单中即可。

代码语言:javascript
复制
(def users (atom [{:id 0 :username "aname"}
                  {:id 1 :username "anothername"}]))

(defn save-user [user]
  (if (not-any? #(= (:username %) (:username user)) @users)
    (do
      (swap! users conj user)
      (status
        (response (str "Saved user with username: " (:username user)))
        201))
    (status
      (response (str "User with username '" (:username user) "' already exists"))
      400)))

我还将全局用户var更改为一个原子。在Clojure中,从函数内部重新定义全局vars是一个很大的不-不。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36664377

复制
相关文章

相似问题

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