在ClojureScript中,为什么可以';我导航到一个手动输入的URL,但是如果我点击一个链接,它会工作吗?
(注意,我使用的是试剂、秘书和复合物(以及其他)) 我想创建一个路由在ClojureScript中,为什么可以';我导航到一个手动输入的URL,但是如果我点击一个链接,它会工作吗?,clojure,clojurescript,compojure,reagent,secretary,Clojure,Clojurescript,Compojure,Reagent,Secretary,(注意,我使用的是试剂、秘书和复合物(以及其他)) 我想创建一个路由/sectest/:id,如果我将浏览器指向该路由,则会出现以下错误: 资源被解释为样式表,但使用MIME类型text/html传输:http://localhost:3449/sectest/css/site.css". asdf:1 拒绝从“”执行脚本http://localhost:3449/sectest/js/app.js'因为其MIME类型('text/html')不可执行,并且启用了严格的MIME类型检查。 但是
/sectest/:id
,如果我将浏览器指向该路由,则会出现以下错误:
资源被解释为样式表,但使用MIME类型text/html传输:http://localhost:3449/sectest/css/site.css".
asdf:1
拒绝从“”执行脚本http://localhost:3449/sectest/js/app.js'因为其MIME类型('text/html')不可执行,并且启用了严格的MIME类型检查。
但是,如果我在浏览器中点击一个链接,导航到该路线,它工作得很好
以下是相关代码:
客户端:
(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))
服务器端:
(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))
因此,下面的链接将我带到我的页面
,控制台会很好地打印出“Hi asdf”
:
[:div [:a {:href "/sectest/asdf"} "SECTEST"]]
但是如果我输入
http://localhost:3449/sectest/asdf
,我收到一个错误,似乎无法跟踪它。我怀疑这可能与试图查找位于/sectest
的资源的代码有关(它不应该这样做),但我无法确认这一点,也无法确定如何使用它。。。我是clojure的新手,请原谅我对某些方面一无所知,有什么想法吗?看看您的服务器端路由,实际上您只有一条路由:
(GET "*" [] loading-page)
因为它处理所有的事情,所以下面的所有路线都不会触发。订购事宜:
(defroutes routes
(GET "/cards" [] cards-page)
(resources "/")
(GET "*" [] loading-page) ;this anticipates client-side routing only
)
以上应该可以做到,我删除了404路由,因为这应该由前端路由处理
当点击SPA中的页面链接时,它目前起作用的原因是它将由秘书处理。如果手动输入url,则会重新加载页面,请求最初由compojure处理
编辑:
(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))
仔细查看后,html模板中css/js
文件的相对链接很可能是罪魁祸首:
/sectest/js/app.js
compojureresources
路由将不匹配,默认的catch-all-route加载页面将作为css/js
文件发送到浏览器。因此出现了错误
对于我的dev env,我还必须纠正引导cljs
任务的:资产路径
,因为源映射
文件遇到了这个问题。应该与lein figwheel
类似,嗯,我完全按照你说的进行了尝试,不幸的是,我得到了相同的行为,问题开头列出了相同的错误。。。听起来你的回答是正确的(只要compojure/秘书是处理事情的人),但我不知道如何让compojure与秘书相处,还有其他想法吗?我会先尝试与秘书使用url前缀,以确保其他一切都是正确的。除了您的代码更改之外,我真的想不出还有什么其他原因没有激活。我将尝试此操作,我正准备写回以下内容:在这种情况下,我得到了相同的错误,我认为它应该会起作用:(get/:id“[id]id)
。如果导航到“/你好”,浏览器将显示“你好”。如果导航到“/hello/world”,我会得到我在开头显示的错误。相关的?使用URL前缀并没有改变任何事情,但我仍然无法理解这一点!我刚刚遇到了一个奇怪的错误,我创建了一个路由(defn-catchall-page[][:p“Hola!”)
&(secretary/defroute“*”[](session/put!:current page#“catchall-page”)
,如果我导航到某个随机路由,浏览器会显示“Hola!”,但当我单击任意位置时,我会被发送回路由“/”定义的主页,但浏览器中的URL保持不变(即一些随机路径)。。。我疯了吗?关于(GET”/:id“[id]id)
,在下一个/
之前,这只会匹配一些字符串,因此您看到的行为是正确的,没有关联。让我尝试了一些东西,结果我的宠物水疗项目也遇到了同样的问题。更新了答案。:)