从 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-responseresoures/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"}))