使用Clojure环服务静态资源
我正在学习如何使用Clojure的戒指创建web应用程序。我试图提供一个静态的.html文件,该文件通过其头部的标记包含对.css文件的引用。.css文件与我尝试提供的index.html文件位于同一目录中,但是,没有加载.css文件。我收到一个错误,状态代码为500,原因短语为: 反应图为零 下面是我的代码:使用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 (
(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。再次感谢你,老兄!。