Compojure和Ring中间件始终返回404

问题描述 投票:1回答:1

我正在尝试在一个使用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)))
clojure middleware compojure ring compojure-api
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.