clojure - 在 ClojureScript 中,为什么我无法导航到手动输入的 URL,但如果我单击链接它就可以工作?

标签 clojure clojurescript compojure reagent secretary

(注意,我正在使用 Reagent、Secretary 和 Compojure(以及其他))

我想创建一个路由 /sectest/:id,如果我将浏览器指向该路由,则会收到以下错误:

资源解释为样式表,但使用 MIME 类型 text/html 进行传输:“http://localhost:3449/sectest/css/site.css”。 阿斯达夫: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))

因此,以下链接将我带到我的页面,控制台打印“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 中的页面链接时起作用的原因是它将由秘书处理。如果您手动输入网址,您将重新加载页面,并且该请求最初由 compojure 处理。

编辑:

仔细观察后,html 模板css/js 文件的相对链接很可能是罪魁祸首:

/sectest/js/app.js

compojure resources 路由不匹配,默认捕获所有路由 loading-page 将作为 css/js 文件提供给您浏览器。因此出现错误。

对于我的开发环境,我还必须更正我的 boot cljs 任务的 :asset-path,因为源映射 文件遭受了问题。应该与 lein-figwheel 类似。

关于clojure - 在 ClojureScript 中,为什么我无法导航到手动输入的 URL,但如果我单击链接它就可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34916548/

相关文章:

api - 使用 Clojure 发出多个 API 请求的功能方法

jQuery 附加的 HTML 元素不会使用 crate 和 clj-js 获取 CSS 样式

javascript - ClojureScript HashMap 性能与 Javascript 对象的比较

emacs - 在开发基于 compojure/ring 的应用程序时使用 emacs/cider 的正确方法是什么?

clojure - 使用 leiningen 访问 clojure 中项目目录外的 JSON 文件

clojure - 解构形式和组合?

java - 从 clojure 使用 java 第三方库的步骤

用于视频聊天的 Clojure 堆栈

clojure - 如何访问 LazySeq 值

ClojureScript Re-frame 订阅取消引用困境