我正在尝试在使用compojure和ring的luminus项目中建立一个简单的中间件。我确定我缺少一些简单的东西,但是我已经设置了一个简单的中间件进行测试,但没有得到我期望的结果。
(defn wrap-api-auth [handler]
(if (= 2 2)
(unauthorized {:body "unauthorized"})
handler))
我希望它会返回401,但它会一直返回404。如果更改了if表达式(= 2 3),则路由会正确触发。作为参考,这是路由,它是luminus添加中间件时生成的默认路由之一。
(GET "/plus" []
:return Long
:middleware [wrap-api-auth]
:query-params [x :- Long, {y :- Long 1}]
:summary "x+y with query-parameters. y defaults to 1."
(ok (+ x y)))
答案 0 :(得分:3)
处理程序是从请求到响应的函数。
中间件是一种函数,它需要一个处理程序并返回另一个包装第一个处理程序的处理程序。
当您的服务启动时,您的wrap-api-auth
被调用,进行检查,如果检查返回true
,将响应存储为处理程序,然后每个请求都由一个恒定响应来处理处理程序。由于响应是一个映射,并且Clojure中的映射可以用作函数,因此这可能不会产生有用的错误,而只会返回nil
,然后将其视为“未找到”。
从原理上讲,您的包装器应该看起来像这样:
(defn wrap-api-auth [handler]
(fn [request]
(if (check-authorization request)
(handler request) ; pass to wrapped handler
(unauthorized …)))) ; do something else