Синтаксис немного неправильный:
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require
[bidi.bidi :as bidi] ))
(dotest
(let [routes ["" {"/foo" :bar
"/items/" {[:id] :item-do}}]]
(spyx (bidi/match-route routes "/foo" :request-method :get))
(spyx (bidi/match-route routes "/items/abc" :request-method :get))) )
дает желаемый результат:
(bidi/match-route routes "/foo" :request-method :get)
=> {:handler :bar,
:request-method :get}
(bidi/match-route routes "/items/abc" :request-method :get)
=> {:route-params {:id "abc"},
:handler :item-do,
:request-method :get}
Вы можете увидеть больше примеров биди в этом демонстрационном проекте .
Обновление № 1:
Используете ли вы figwheel-main ? Это намного лучше, чем оригинальное колесо. Обязательно работайте с :optimizations :none
, так как вы получите гораздо лучшие сообщения об ошибках. Возможно, вам придется обновить ваш вопрос, добавив больше кода и новые / измененные сообщения об ошибках.
Также попробуйте разбить вызовы функций с помощью println
отладочных выходных данных и, возможно, некоторых модульных тестов, начиная с самой маленькой части и работая outward.
Update # 2
Вы по-прежнему неправильно понимаете синтаксис. Обратите внимание, что вам нужно обернуть ключевое слово param в вектор:
(let [foo-handler (fn [& args] "dummy-handler")
routes ["" {"/foo/" {[:id] foo-handler}}]
result (bidi/match-route routes "/foo/123" :request-method :get)
handler (grab :handler result)]
(is (wild-match? {:route-params {:id "123"}
:handler :*
:request-method :get}
result))
(is= "dummy-handler" (handler)))
Не имеет значения, является ли возвращаемое значение ключевым словом типа :foo
или функцией-обработчиком типа foo-handler
. result
все еще имеет ту же форму:
result => {:route-params {:id "123"},
:handler #object[tst.demo.core$fn__20970$foo_handler__21031 0x1926e42e "tst.demo.core$fn__20970$foo_handler__21031@1926e42e"],
:request-method :get}