【问题标题】:Compojure & Ring Middleware Always Returns 404Compojure & Ring 中间件总是返回 404
【发布时间】:2018-12-27 00:49:54
【问题描述】:

我正在尝试在使用 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】:

    处理程序是从请求到响应的函数。

    中间件是一个函数,它接受一个处理程序并返回包装第一个处理程序的另一个处理程序。

    您的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
    

    【讨论】:

    • 感谢您的回复和解释。这很有效,帮助我理解了我做错了什么。
    • 不错。我立即看到了缺少(fn [request] ...) 的问题,但没有意识到这会导致安装一个类似于(constantly nil) 的处理程序。
    猜你喜欢
    • 2015-11-26
    • 2013-01-31
    • 2014-11-25
    • 2019-01-15
    • 2021-08-05
    • 2015-07-31
    • 2016-02-04
    • 2014-05-29
    • 2021-07-28
    相关资源
    最近更新 更多