Звонок с возвратом параметра 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)}})}}]]])
Другие вопросы по тегам