This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-05-24
Channels
- # aleph (1)
- # beginners (43)
- # calva (22)
- # cider (51)
- # clerk (1)
- # clj-kondo (20)
- # clojure (29)
- # clojure-denmark (1)
- # clojure-europe (73)
- # clojure-finland (28)
- # clojure-nl (1)
- # clojure-norway (7)
- # clojure-spec (7)
- # clojure-uk (4)
- # clojurescript (12)
- # data-science (2)
- # datomic (51)
- # events (1)
- # fulcro (20)
- # hyperfiddle (28)
- # integrant (6)
- # malli (20)
- # matrix (2)
- # music (1)
- # off-topic (66)
- # reitit (17)
- # releases (5)
- # ring (1)
- # shadow-cljs (31)
- # xtdb (6)
what is the correct way to invoke a function before and after on invocation of every route defined
consider the example of this demo application https://github.com/prestancedesign/usermanager-reitit-example/blob/main/src/usermanager/handler.clj#L27-L39
(defn before-fn [request]
(println "before")
(assoc "before" :before))
(defn after-fn []
( println "after"))
I want the before-fn
be invoked before processing the request and after-fn
after processing
1. defining the middleware and setting it in the options param of (ring/router)
as {:data {:middleware [ &middlewares]}}
2. wrapping the (ring/ring-handler)
in a custom function say my-ring-handler
and use it to create app
@U2FRKM4TW how about custom like my-ring-handler
?
The approaches are identical in terms of the end result that you desire.
But if you use the middleware approach, that middleware will become available to other things such as :reitit.middleware/transform
. Whether you need that or not is up to you.
(defn before-fn [request]
(println "before")
(assoc "before" :before))
(defn after-fn []
(println "after"))
(defn my-ring-handler
([router opts]
(my-ring-handler router nil opts))
([router handler opts]
(fn
([request]
(before-fn request)
(http/ring-handler router default-handler nil)
(after-fn))
([request respond raise]
(before-fn request)
(http/ring-handler router default-handler opts)
(after-fn)))))
Something like this, haven't checked:
(defn my-ring-handler
([router]
(my-ring-handler router nil))
([router default-handler]
(my-ring-handler router default-handler nil))
([router default-handler opts]
(let [handler (http/ring-handler router default-handler opts)]
(with-meta
(fn
([request]
(before-fn request)
(hanler router default-handler nil)
(after-fn))
([request respond raise]
(before-fn request)
(handler router
(fn [response]
(after-fn)
(respond response))
raise)))
(meta handler)))))
And you don't really need the respond raise
arity unless you use Ring 2 with async requests.