Serving index.html file from compojure

巧了我就是萌 提交于 2019-12-10 19:03:11

问题


I'm new to clojure and compojure and trying out the compojure along with ring to create a basic web application.

here is my 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))

i have this index.html file under /resources/public but the application is not rendering this html file. Instead getting Not found

I have searched a lot it, even this Serve index.html at / by default in Compojure does not seems to resolve the issue.

Not sure what am i missing here.


回答1:


Maybe you want to try use some template library, such as Selmer. So you can do something like this:

(defroutes myapp
  (GET "/hello/" []
    (render-string (read-template "templates/hello.html"))))

Or passing some value:

(defroutes myapp
  (GET "/hello/" [name]
    (render-string (read-template "templates/hello.html") {name: "Jhon"})))

And, as @piotrek-Bzdyl said:

(GET  "/" [] (resource-response "index.html" {:root "public"}))



回答2:


Naveen

Here is a snippet of my own that seems to work. In comparison with yours, you do not have a resource path in 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))



回答3:


You don't need specify your routing for serving files from resoures/public using file-response at this directory will be served thanks to site-defaults. The only part you are missing is mapping / path to /index.html which can be done with the code you mentioned from another question. So the solution would be:

(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)

On a side note, you should prefer using ring.util.response/resource-response as it serves files from classpath and will work also when you package you app into a jar file. file-response uses file system to locate files and won't work from inside jar file.



来源:https://stackoverflow.com/questions/35828884/serving-index-html-file-from-compojure

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!