Почему в 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
,