从 compojure 服务 index.html 文件
Serving index.html file from compojure
我是 clojure 和 compojure 的新手,正在试用 compojure 和 ring 来创建基本的 Web 应用程序。
这是我的 handler.clj
(ns gitrepos.handler
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.util.response :as resp]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]]))
(defroutes app-routes
(GET "/" [] (resp/file-response "index.html" {:root "public"}))
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))
我在 /resources/public 下有这个 index.html 文件,但是应用程序没有渲染这个 html 文件。取而代之的是 Not found
我已经搜索了很多,即使这样Serve index.html at / by default in Compojure似乎也没有解决问题。
不确定我在这里遗漏了什么。
纳文
这是我自己的一个似乎有效的片段。与你的相比,你没有defroutes
中的资源路径:
(defroutes default-routes
(route/resources "public")
(route/not-found
"<h1>Resource you are looking for is not found</h1>"))
(defroutes app
(wrap-defaults in-site-routes site-defaults)
(wrap-defaults test-site-routes site-defaults)
(wrap-restful-format api-routes)
(wrap-defaults default-routes site-defaults))
您不需要为使用 file-response
的 resoures/public
提供的文件指定路由,感谢 site-defaults
,将在该目录提供服务。您唯一缺少的部分是将 /
路径映射到 /index.html
,这可以使用您在另一个问题中提到的代码来完成。所以解决方案是:
(defn wrap-dir-index [handler]
(fn [req]
(handler
(update
req
:uri
#(if (= "/" %) "/index.html" %)))))
(defroutes app-routes
(route/not-found "Not Found"))
(def app
(-> app-routes
(wrap-defaults site-defaults)
(wrap-dir-index)
附带说明一下,您应该更喜欢使用 ring.util.response/resource-response
,因为它提供类路径中的文件,并且在您将应用程序打包到 jar 文件中时也可以使用。 file-response
使用文件系统定位文件,无法在 jar 文件中工作。
也许您想尝试使用一些模板库,例如Selmer。所以你可以这样做:
(defroutes myapp
(GET "/hello/" []
(render-string (read-template "templates/hello.html"))))
或传递一些值:
(defroutes myapp
(GET "/hello/" [name]
(render-string (read-template "templates/hello.html") {name: "Jhon"})))
而且,正如@piotrek-Bzdyl 所说:
(GET "/" [] (resource-response "index.html" {:root "public"}))
我是 clojure 和 compojure 的新手,正在试用 compojure 和 ring 来创建基本的 Web 应用程序。
这是我的 handler.clj
(ns gitrepos.handler
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.util.response :as resp]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]]))
(defroutes app-routes
(GET "/" [] (resp/file-response "index.html" {:root "public"}))
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))
我在 /resources/public 下有这个 index.html 文件,但是应用程序没有渲染这个 html 文件。取而代之的是 Not found
我已经搜索了很多,即使这样Serve index.html at / by default in Compojure似乎也没有解决问题。
不确定我在这里遗漏了什么。
纳文
这是我自己的一个似乎有效的片段。与你的相比,你没有defroutes
中的资源路径:
(defroutes default-routes
(route/resources "public")
(route/not-found
"<h1>Resource you are looking for is not found</h1>"))
(defroutes app
(wrap-defaults in-site-routes site-defaults)
(wrap-defaults test-site-routes site-defaults)
(wrap-restful-format api-routes)
(wrap-defaults default-routes site-defaults))
您不需要为使用 file-response
的 resoures/public
提供的文件指定路由,感谢 site-defaults
,将在该目录提供服务。您唯一缺少的部分是将 /
路径映射到 /index.html
,这可以使用您在另一个问题中提到的代码来完成。所以解决方案是:
(defn wrap-dir-index [handler]
(fn [req]
(handler
(update
req
:uri
#(if (= "/" %) "/index.html" %)))))
(defroutes app-routes
(route/not-found "Not Found"))
(def app
(-> app-routes
(wrap-defaults site-defaults)
(wrap-dir-index)
附带说明一下,您应该更喜欢使用 ring.util.response/resource-response
,因为它提供类路径中的文件,并且在您将应用程序打包到 jar 文件中时也可以使用。 file-response
使用文件系统定位文件,无法在 jar 文件中工作。
也许您想尝试使用一些模板库,例如Selmer。所以你可以这样做:
(defroutes myapp
(GET "/hello/" []
(render-string (read-template "templates/hello.html"))))
或传递一些值:
(defroutes myapp
(GET "/hello/" [name]
(render-string (read-template "templates/hello.html") {name: "Jhon"})))
而且,正如@piotrek-Bzdyl 所说:
(GET "/" [] (resource-response "index.html" {:root "public"}))