Fork me on GitHub
Ian McQuoid05:09:54

Hello! I'm having an issue with adding coercion middleware (but since I'm very new to all of this, I'm having trouble explaining my problem correctly 🥲) I'm currently building a webapp on top of the luminus template for lein and when I add my own middleware to a route, it seems to overwrite(?) or generally stop the template's error reporting middleware. It's very likely that with how the template handles middleware that I can't just add

:middleware [foo]
as I'd like to, but I'm hopeful that there's an easy fix 🙂

Ian McQuoid05:09:13

Oh, after fiddling with it, I think that it's because I'm registering two exception handling middleware at the same time (the coercion one is a merge of the default handlers and one looking for request-coercion errors).

Ian McQuoid05:09:45

Does anyone know of a way to make these two play nicely?


Could someone help me understand what it means here > Before the actual coercion, we should need to compile the coercers against the route data. Compiled coercers yield much better performance and the manual step of adding a coercion compiler makes things explicit and non-magical. I see you need to provide a corecion/compile-rquest-coercers value

(require '[reitit.coercion :as coercion])
(require '[reitit.coercion.schema])
(require '[schema.core :as s])

(def router
    ["/:company/users/:user-id" {:name ::user-view
                                 :coercion reitit.coercion.schema/coercion
                                 :parameters {:path {:company s/Str
                                                     :user-id s/Int}}}]
    {:compile coercion/compile-request-coercers}))
So compiling happens before run time, what can be done here that isn't at run time as the search param arguments need to be changed at run time?


> The compiler added a :result key into the match (done just once, at router creation time), which holds the compiled coercers. We are almost done.


i'm confused, wouldn't that cljs coercion functions get compiled by the compiler normally to a js object?


@drewverlee router compilation happens at language runtime: route tree, models and middleware/interceptor/controller chains are read from the (data-)definitions and optimized pure functions are returned. If you need to change those definitions, you need to re-create the router - or use dynamic routing, which is described in the docs.


as an example are we saying that when the routes are compiled

{:path {:company s/Str :user-id s/Int}}
is turned into (fn [company user-id] ...)