Звонок с возвратом параметра URL-адреса принуждения: статус 500
Это мое приложение:
(def routes
[["/api"
ping-routes
submissions-routes]])
(def app
(ring/ring-handler
(ring/router routes
{:data {:coercion reitit.coercion.schema/coercion
:muuntaja m/instance
:middleware [[wrap-cors
:access-control-allow-origin [#"http://localhost:4200"]
:access-control-allow-methods [:get :post]]
parameters-middleware
format-negotiate-middleware
format-response-middleware
exception-middleware
format-request-middleware
coerce-exceptions-middleware
coerce-request-middleware
coerce-response-middleware]}})
(ring/routes
(ring/redirect-trailing-slash-handler {:method :strip})
(ring/create-default-handler
{:not-found (constantly {:status 404 :body "Route not found"})}))))
(def ping-routes
["/ping" {:get (fn [req]
{:status 200
:body {:ping "pong"}})}])
(def submissions-routes
["/submissions"
["" {:get get-submissions}]
["/:id" {:get {:parameters {:path {:id s/Int}}
:handler get-submission-by-id}}]])
(comment
(get-submission-by-id {:parameters {:path 20}}))
Когда я пытаюсь получить доступ к "submissions/1", я получаю "{"type":"Exception","class":"clojure.lang.ExceptionInfo"}" в браузере или в repl:
{:status 500,
:body
#object[java.io.ByteArrayInputStream 0x3db2e139 "java.io.ByteArrayInputStream@3db2e139"],
:headers {"Content-Type" "application/json; charset=utf-8"}}
Если я запускаю свой код комментария, то обработчик get-submission-by-id работает нормально сам по себе. Заранее спасибо.
3 ответа
Я думаю (и это частично связано с тем, что вы не предоставили правильный MVCE), что вы путаете пространства имен для схемы (schema.core
) и приведение схемы из reitit (reitit.ring.coercion
).
Если вам требуется:
-
reitit.coercion.schema :as rcs
-
schema.core :as s
И используйте:coercion rcs/coercion
в вашем роутере эта проблема должна быть решена.
Далее, вам никогда не придется догадываться , в чем проблема. Убедитесь, что вы знаете, какие исключения выдаются. Например, вы можете распечатать исключения, если заменитеexception-middleware
с
(rrme/create-exception-middleware
(merge
rrme/default-handlers
{::rrme/wrap (fn [handler ex req]
(prn ex)
(handler ex req))}))
сreitit.ring.middleware.exception :as rrme
в ваших требованиях.
s/Int будет заменен на Long . По умолчанию числа в Java являются длинными.
Попробуйте более точно определить свои маршруты с помощью имен и строгой структуризации, например:
(def submissions-routes
[["/submissions" {:name ::experiment}
["" {:name ::root-submission-route
:get {:handler (fn [_] {:status 200
:body {:resp "empty get"}})}}]
["/:id" {:name ::root-submission-route-id
:get {:parameters {:path {:id Long}}
:handler (fn [r] {:status 200 :body {:resp (-> r :path-params :id)}})}}]]])