Почему в ClojureScript я не могу перейти к URL-адресу, введенному вручную, но если я нажму на ссылку, это сработает?

(Обратите внимание, я использую Реагент, Секретарь и Композицию (среди прочих))

Я хочу создать маршрут /sectest/:id и, если я указываю браузеру на этот маршрут, я получаю следующую ошибку:

Resource interpreted as Stylesheet but transferred with MIME type text/html: "http://localhost:3449/sectest/css/site.css". asdf:1 Refused to execute script from 'http://localhost:3449/sectest/js/app.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

Но если я нажимаю на ссылку в браузере, которая ведет по этому маршруту, он работает нормально...

Вот соответствующий код:

Сторона клиента:

(secretary/defroute "/sectest/:id" [id]
  (do
    (js/console.log (str "Hi " id))
    (session/put! :current-page #'my-page)))

Сторона сервера:

(defroutes routes
  (GET "*" [] loading-page) ;this anticipates client-side routing only
  (GET "/cards" [] cards-page)
  (resources "/")
  (not-found "Not Found"))

(def app (wrap-middleware #'routes))

Так что следующая ссылка приводит меня к my-page и консоль печатает "Hi asdf" просто хорошо:

[:div [:a {:href "/sectest/asdf"} "SECTEST"]]

Но если я наберу в http://localhost:3449/sectest/asdf Я получаю сообщение об ошибке и не могу его отследить. Я подозреваю, что это может быть связано с кодом, пытающимся найти ресурсы, расположенные на /sectest, (чего не должно быть), но я не могу подтвердить это или понять, как с этим работать... Я новичок в уловке, так что простите, если я в какой-то степени абсолютно невежественен, какие-нибудь мысли?

1 ответ

Решение

Посмотрите на маршрутизацию на стороне сервера, фактически у вас есть только один маршрут:

(GET "*" [] loading-page)    

Поскольку он обрабатывает все, все следующие маршруты никогда не сработают. Заказ имеет значение:

(defroutes routes
  (GET "/cards" [] cards-page)
  (resources "/")
  (GET "*" [] loading-page) ;this anticipates client-side routing only
)

Вышесказанное должно сработать, я удалил маршрут 404, так как это должно быть обработано маршрутизацией внешнего интерфейса.

Причина, по которой он работает в настоящее время при нажатии на ссылку на страницу в вашем SPA, заключается в том, что он будет обрабатываться секретарем. Если вы вводите URL-адрес вручную, вы выполняете перезагрузку страницы, и запрос обрабатывается compojure изначально.

Редактировать:

После более пристального взгляда, relative links на ваш css/js файлы в вашем html template Скорее всего, виновник здесь:

/sectest/js/app.js

Композиция resources маршрут не совпадает, и по умолчанию перехватывается весь маршрут loading-page подается как css/js файл в ваш браузер. Отсюда и ошибка.

Для моего dev env я также должен был исправить :asset-path из моего boot cljs задача как source mapping файлы пострадали от проблемы. Должно быть похоже на lein-figwheel,

Другие вопросы по тегам