使用Clojure环服务静态资源

使用Clojure环服务静态资源,clojure,compojure,ring,Clojure,Compojure,Ring,我正在学习如何使用Clojure的戒指创建web应用程序。我试图提供一个静态的.html文件,该文件通过其头部的标记包含对.css文件的引用。.css文件与我尝试提供的index.html文件位于同一目录中,但是,没有加载.css文件。我收到一个错误,状态代码为500,原因短语为: 反应图为零 下面是我的代码: (defroutes approutes (GET "/" reqmap (resource-response "index.html"))) (def server (

我正在学习如何使用Clojure的戒指创建web应用程序。我试图提供一个静态的.html文件,该文件通过其头部的标记包含对.css文件的引用。.css文件与我尝试提供的index.html文件位于同一目录中,但是,没有加载.css文件。我收到一个错误,状态代码为500,原因短语为:

反应图为零

下面是我的代码:

(defroutes approutes
  (GET "/" reqmap
    (resource-response "index.html")))


(def server (run-jetty #'approutes {:join? false, :port 3000}))
我错过了什么?我如何提供一个html文件,它引用了其他文件.css、.js、.jpeg等?虽然我不能完全解释为什么在Ring.middleware.resource名称空间中使用Ring的wrap资源中间件,但我还是有一些运气,尽管该函数仅在请求映射匹配静态资源时使用,并且正如您所看到的,路由/本身与资源不匹配


谢谢。

您需要添加一个中间件,用于从您可以选择的文件夹中提供静态文件,如下所示:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
;; 添加到文件顶部的ns:requires :require[ring.middleware.resource:参考包装资源] ;; 更多您现有的代码在这里。。。 def应用程序 包装资源批准公开;;从项目中的resources/public提供静态文件 def服务器运行jetty'应用程序{:加入?错误,:端口3000} 这应该足以让您继续运行,因此如果启动服务器,您应该能够打开项目中public/resources/style.css中的文件地址。任何其他静态文件都可以工作。中有一个指南解释了两个类似的功能,您可以使用中间件

接下来,在index.html文件中,您应该能够引用其他文件,如CSS文件,如下所示:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
下面是我不久前写的一个示例项目,它确实展示了相同的想法:

更新

我已经从头开始快速运行,这将帮助您找到问题所在

使用以下内容创建了一个新项目:

lein new app hello-ring
实际上,这个名字有点误导,因为我们将同时使用Ring和compoure

我们将使用以下内容更新文件project.clj:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
defproject hello ring 0.1.0-SNAPSHOT :description FIXME:写描述 :urlhttp://example.com/FIXME :license{:name EPL-2.0或GPL-2.0或更高版本,带Classpath-exception-2.0 :urlhttps://www.eclipse.org/legal/epl-2.0/} :依赖项[[org.clojure/clojure 1.10.0] [compojure 1.6.1] [环/环芯1.6.3] [环形/环形码头适配器1.6.3]] :main^:跳过aot hello-ring.core :目标路径目标/%s :profiles{:uberjar{:aot:all} 现在让我们编辑文件src/hello\u ring/core.clj,其内容如下:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
ns hello-ring.core :需要[ring.adapter.jetty:参考[run jetty]] [ring.middleware.resource:参考[wrap resource]] [ring.util.response:参考[resource response]] [compojure.core:参考[defroutes GET]] :gen类 取消批准 获取/[] 资源响应public/index.html def应用程序 ->批准 将资源公开;;提供资源/公共资源中的文件 defn服务器[] 运行jetty应用程序{:join?false,:port 3000} defn-主[&args] 服务器 最后,让我们创建两个静态资源。创建文件夹结构resources/public/css,并在文件resources/public/css/style.css中输入以下内容:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
身体{ 字体:无衬线; 左侧填充:20px; } 。。。以及resources/public/index.HTML中的基本HTML文件,其中包含以下内容:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
它起作用了! 它起作用了! 。。。就这样。HTML文件将尝试加载CSS文件。保存所有内容并检查其是否与以下文件夹结构匹配:

.
├── CHANGELOG.md
├── doc
│   └── intro.md
├── LICENSE
├── project.clj
├── README.md
├── resources
│   └── public
│       ├── css
│       │   └── style.css
│       └── index.html
├── src
│   └── hello_ring
│       └── core.clj
└── test
    └── hello_ring
        └── core_test.clj
现在,您应该能够通过以下命令行启动服务:

lein run
输出将如下所示:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
连接到中的服务器。。。您应该可以在浏览器中看到您的页面,它可以正常工作!消息和基本CSS重置。在控制台中,您很可能会看到一些异常,因为浏览器试图从您的服务器加载文件/favicon.ico(该文件不存在)。您现在可以将其创建为空文件


我希望这会有所帮助。

您需要添加一个中间件,用于从您可以选择的文件夹中提供静态文件,如下所示:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
;; 添加到文件顶部的ns:requires :require[ring.middleware.resource:参考包装资源] ;; 更多您现有的代码在这里。。。 def应用程序 包装资源批准公开;;从项目中的resources/public提供静态文件 def服务器运行jetty'应用程序{:加入?错误,:端口3000} 这应该足以让您继续运行,因此如果启动服务器,您应该能够打开项目中public/resources/style.css中的文件地址。任何其他静态文件都可以工作。那个前男友的房间里有个导游 您可以使用两个类似的中间件功能

接下来,在index.html文件中,您应该能够引用其他文件,如CSS文件,如下所示:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
下面是我不久前写的一个示例项目,它确实展示了相同的想法:

更新

我已经从头开始快速运行,这将帮助您找到问题所在

使用以下内容创建了一个新项目:

lein new app hello-ring
实际上,这个名字有点误导,因为我们将同时使用Ring和compoure

我们将使用以下内容更新文件project.clj:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
defproject hello ring 0.1.0-SNAPSHOT :description FIXME:写描述 :urlhttp://example.com/FIXME :license{:name EPL-2.0或GPL-2.0或更高版本,带Classpath-exception-2.0 :urlhttps://www.eclipse.org/legal/epl-2.0/} :依赖项[[org.clojure/clojure 1.10.0] [compojure 1.6.1] [环/环芯1.6.3] [环形/环形码头适配器1.6.3]] :main^:跳过aot hello-ring.core :目标路径目标/%s :profiles{:uberjar{:aot:all} 现在让我们编辑文件src/hello\u ring/core.clj,其内容如下:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
ns hello-ring.core :需要[ring.adapter.jetty:参考[run jetty]] [ring.middleware.resource:参考[wrap resource]] [ring.util.response:参考[resource response]] [compojure.core:参考[defroutes GET]] :gen类 取消批准 获取/[] 资源响应public/index.html def应用程序 ->批准 将资源公开;;提供资源/公共资源中的文件 defn服务器[] 运行jetty应用程序{:join?false,:port 3000} defn-主[&args] 服务器 最后,让我们创建两个静态资源。创建文件夹结构resources/public/css,并在文件resources/public/css/style.css中输入以下内容:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
身体{ 字体:无衬线; 左侧填充:20px; } 。。。以及resources/public/index.HTML中的基本HTML文件,其中包含以下内容:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
它起作用了! 它起作用了! 。。。就这样。HTML文件将尝试加载CSS文件。保存所有内容并检查其是否与以下文件夹结构匹配:

.
├── CHANGELOG.md
├── doc
│   └── intro.md
├── LICENSE
├── project.clj
├── README.md
├── resources
│   └── public
│       ├── css
│       │   └── style.css
│       └── index.html
├── src
│   └── hello_ring
│       └── core.clj
└── test
    └── hello_ring
        └── core_test.clj
现在,您应该能够通过以下命令行启动服务:

lein run
输出将如下所示:

$ lein run
2019-08-05 23:46:14.919:INFO::main: Logging initialized @1221ms
2019-08-05 23:46:16.281:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2019-08-05 23:46:16.303:INFO:oejs.ServerConnector:main: Started ServerConnector@2c846d55{HTTP/1.1}{0.0.0.0:3000}
2019-08-05 23:46:16.303:INFO:oejs.Server:main: Started @2606ms
连接到中的服务器。。。您应该可以在浏览器中看到您的页面,它可以正常工作!消息和基本CSS重置。在控制台中,您很可能会看到一些异常,因为浏览器试图从您的服务器加载文件/favicon.ico(该文件不存在)。您现在可以将其创建为空文件


我希望这能有所帮助。

谢谢你的回答。我尝试了以下操作:defroutes approutes GET/reqmap{:status 200:body slurp resources/public/index.html}def app wrap resources approutes public def server运行jetty'app{:join?false,:port 3000},并且能够在我的本地主机上看到index.html加载。。。但是,它仍然没有提取在其。。。这是预期行为的一部分吗?它应该适用于所有类型的静态资源。我猜问题出在配置的某个地方。请检查我对答案的更新,并检查您项目中的路径是否正确,可能您的CSS文件位于另一个文件夹中,或者在编辑代码时出现了拼写错误。非常感谢。我会弄清楚我的代码中有什么东西没有正确地提取css,是提取html文件,而不是css。再次感谢你,老兄!。谢谢你的回答。我尝试了以下操作:defroutes approutes GET/reqmap{:status 200:body slurp resources/public/index.html}def app wrap resources approutes public def server运行jetty'app{:join?false,:port 3000},并且能够在我的本地主机上看到index.html加载。。。但是,它仍然没有提取在其。。。这是预期行为的一部分吗?它应该适用于所有类型的静态资源。我猜问题出在配置的某个地方。请检查我对答案的更新,并检查您项目中的路径是否正确,可能您的CSS文件位于另一个文件夹中,或者在编辑代码时出现了拼写错误。非常感谢。我会弄清楚我的代码中有什么东西没有正确地提取css,是提取html文件,而不是css。再次感谢你,老兄!。