Невозможно сопоставить произвольные маршруты в clojurescript bidi - PullRequest
0 голосов
/ 28 марта 2020

Я определил маршруты в биди так же, как в приложении cl js:

(def routes 
["" {
     "/foo" :bar
    ["/items" :id] :item-do}]
)

(defn- parse-url [url] (bidi/match-route routes url))
(defn- dispatch-route [matched-route]
  (let [panel-name (keyword (name (:handler matched-route)))]
    (dispatch [:active-panel panel-name])))

(def history (pushy/pushy dispatch-route parse-url))

Когда я go к маршруту "/ foo", я получаю панель, связанную с :bar, но когда я go к элементам маршрута / somerandomstring, я ожидаю увидеть панель, связанную с :item-do, но вместо этого вижу пустую страницу, и в консоли она говорит:

Uncaught SyntaxError: Unexpected token '<'                                  myapp.js 1
Reference Error: myapp is not defined.                                      somerandomstring:14

Что я делаю не так и как мне это исправить? Как правильно сопоставить произвольную строку в URI в BIDI?

- EDIT -

Я нашел это:

Когда я сопоставляю только это:

{
"/foo" index-handler}

Работает.

Но когда я сопоставляю

{
"/foo" [:id index-handler]
}

Несмотря на то, что (bidi/match-route routes "/foo/abc") выводит {:handler index-handler, :route-params {:id "abc"}}, на самом деле переход на этот маршрут в браузере дает ошибку, о которой я упоминал.

Reference Error: myapp is not defined.                                      somerandomstring:14

В консоли somerandomstring: 14 фактически является индексом. html, который я отправляю обратно, а строка 14 выглядит следующим образом:

<script type="text/javascript">myapp.system.go();</script>

Почему это?

1 Ответ

0 голосов
/ 28 марта 2020

Синтаксис немного неправильный:

(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}
...