Простое веб-приложение Bidi, Ring и Lein выдает ошибку 500 - PullRequest
1 голос
/ 15 февраля 2020

Я изучаю Clojure для Интернета. Я пытаюсь реализовать приложение Bidi и Ring в Lein. Когда я открываю сайт, я получаю ошибку 500:

ОШИБКА HTTP: 500

Проблема доступа /. Причина:

Карта ответов равна nil

Работает на Jetty: //

Мои файлы следующие:

. / project.clj

(defproject bidi-ring "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
            :url "https://www.eclipse.org/legal/epl-2.0/"}
  :dependencies [[org.clojure/clojure "1.10.0"]
                 [bidi "2.1.6"]
                 [ring/ring-core "1.6.3"]
                 [ring/ring-jetty-adapter "1.6.3"]]
  :repl-options {:init-ns my.app}
  :main my.app)

. / src / my / handler.clj

(ns my.handler (:gen-class)
    (:require [bidi.ring :refer (make-handler)]
              [ring.util.response :as res]))
(defn index-handler
  [request]
  (res/response "Homepage"))
(defn article-handler
  [{:keys [route-params]}]
  (res/response (str "You are viewing article: " (:id route-params))))
(def handler
  (make-handler ["/" {"index.html" index-handler
                      ["articles/" :id "/article.html"] article-handler}]))

. / src / my / app. clj

(ns my.app (:gen-class)
    (:require [my.handler :refer [handler]]
              [ring.middleware.session :refer [wrap-session]]
              [ring.middleware.flash :refer [wrap-flash]]))
(use 'ring.adapter.jetty)

(defn -main []

  (def app
    (-> handler
        wrap-session
        wrap-flash))


  (run-jetty app {:port 3000}))

Как это исправить?

1 Ответ

2 голосов
/ 15 февраля 2020

Вы допустили ошибку в своих маршрутах. Посмотрите на это демо-репозиторий Bidi:

https://github.com/io-tupelo-demo/bidi

Код в строке 16 из tst.demo.core показывает, что происходит. В bidi маршрут "/index.html" не включает вырожденный маршрут "/":

  (let [routes   ["/" ; common prefix
                  {"index.html"   :index
                   "article.html" :article}]
        routes-2 ["/" ; common prefix
                  {""             :index ; add a default route so "/" and "/index.html" both => `:index` handler
                   "index.html"   :index
                   "article.html" :article}]] 
    (is= (bidi/match-route routes "/index.html") {:handler :index}) ; normal case

    (is= (bidi/match-route routes "/") nil) ; plain "/" route is not available, has no default
    (is= (bidi/match-route routes-2 "/") {:handler :index})) ; Now we get the :index route

Если маршрут не соответствует, match-route возвращает nil, что Затем сервер преобразуется в 500 not-found, который отправляется в браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...