从compojure提供index.html文件

时间:2016-03-06 15:42:22

标签: clojure compojure

我是一个新的clojure和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文件。取而代之的是未找到

我已经搜索了很多,即使这Serve index.html at / by default in Compojure似乎无法解决问题。

不确定我在这里缺少什么。

3 个答案:

答案 0 :(得分:1)

纳温

这是我自己的片段似乎有用。与您的相比,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))

答案 1 :(得分:0)

由于resoures/public,您无需使用file-response来指定您使用site-defaults的{​​{1}}服务文件的路由。您唯一缺少的部分是将/路径映射到/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,因为它提供来自classpath的文件,并且当您将应用程序打包到jar文件中时也会起作用。 file-response使用文件系统来查找文件,并且无法在jar文件中使用。

答案 2 :(得分:0)

也许您想尝试使用一些模板库,例如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"}))