This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2021-07-21
Channels
- # announcements (1)
- # babashka (13)
- # beginners (85)
- # calva (1)
- # chlorine-clover (16)
- # cider (30)
- # clj-kondo (2)
- # clj-on-windows (5)
- # cljdoc (3)
- # cljs-dev (12)
- # cljsrn (19)
- # clojure (88)
- # clojure-europe (39)
- # clojure-nl (7)
- # clojure-sweden (3)
- # clojure-uk (8)
- # clojurescript (35)
- # core-async (3)
- # data-science (2)
- # datomic (17)
- # defnpodcast (3)
- # deps-new (1)
- # editors (18)
- # emacs (4)
- # events (1)
- # expound (1)
- # figwheel-main (8)
- # fulcro (9)
- # graalvm (2)
- # graalvm-mobile (11)
- # helix (44)
- # jobs (7)
- # lsp (95)
- # luminus (9)
- # malli (6)
- # meander (4)
- # membrane (2)
- # missionary (13)
- # off-topic (98)
- # pathom (2)
- # polylith (4)
- # portal (3)
- # re-frame (6)
- # reagent (27)
- # reitit (3)
- # releases (3)
- # remote-jobs (6)
- # rewrite-clj (1)
- # rum (2)
- # sci (3)
- # shadow-cljs (7)
- # sql (66)
- # tools-deps (80)
- # vim (5)
- # xtdb (3)
If I have middleware {:middleware [my-mw]}
that is defined as a compiled middleware with options def my-mw {:name ::foo :compile (fn [{:keys [hello world]} options] ...)
. How to I pass in the options map? I tried {:middleware [[my-mw options-map]]}
but that does not compile, giving an arity warning. I tried adding a options
key to routes where I want it used, but that didn't seem to work either
if i understand correctly, that vector form is converted into a canonical middleware representation, by (reitit.middleware/into-middleware [my-mw options-map] route-data router-opts)
,
where router-opts
can contain for example a reitit.middleware/registry
which can map keywords to middlewares.
try to see if calling that function directly with your example yields what u expect.
given a ring handler:
(defn test-handler [req] {:status 200, :headers {}, :body "hello"})
i create a ring router using the var of the handler:
(-> ["/" {:get {:handler #'test-handler}}] reitit.ring/router reitit.core/routes)
=> [["/" {:get {:handler #'xxx/test-handler}}]]
however, i get an error, if i try to create a "http" router from it:
(-> ["/" {:get {:handler #'test-handler}}] reitit.http/router)
Execution error (ExceptionInfo) at reitit.exception/exception (exception.cljc:19).
No implementation of method: :into-interceptor of protocol: #'reitit.interceptor/IntoInterceptor found for class: clojure.lang.Var
i was expecting the middleware and the interceptor based implementations compatible in this regard.
i don't understand why does the middleware router even accepts vars.
i don't see it explicitly supported:
(clojure.data/diff
(-> reitit.interceptor/IntoInterceptor :impls keys set)
(-> reitit.middleware/IntoMiddleware :impls keys set))
=>
[#{reitit.interceptor.Interceptor}
#{reitit.middleware.Middleware}
#{nil
clojure.lang.APersistentVector
clojure.lang.Keyword
clojure.lang.Fn
clojure.lang.PersistentArrayMap
clojure.lang.PersistentHashMap}]