首页 > 解决方案 > 我如何在 clojure 中使用环处理程序服务器静态 html 文件?

问题描述

我正在尝试通过基于环的 api 服务器路径来服务器 html。但是每次我到达终点时,我都会收到这个奇怪的错误

java.lang.IllegalArgumentException: No implementation of method: :write-body-to-stream of protocol: #'ring.core.protocols/StreamableResponseBody found for class: clojure.lang.PersistentArrayMap
    at clojure.core$_cache_protocol_fn.invokeStatic(core_deftype.clj:583) ~[clojure-1.10.1.jar:?]
    at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:575) ~[clojure-1.10.1.jar:?]
    at ring.core.protocols$eval18503$fn__18504$G__18494__18513.invoke(protocols.clj:8) ~[?:?]
    at ring.util.servlet$update_servlet_response.invokeStatic(servlet.clj:106) ~[?:?]
    at ring.util.servlet$update_servlet_response.invoke(servlet.clj:91) ~[?:?]
    at ring.util.servlet$update_servlet_response.invokeStatic(servlet.clj:95) ~[?:?]
    at ring.util.servlet$update_servlet_response.invoke(servlet.clj:91) ~[?:?]
    at ring.adapter.jetty$proxy_handler$fn__18623.invoke(jetty.clj:27) ~[?:?]

这是我的 api 返回的内容。

{:status 200
:body   (resource-response "index.html" {:root "public"})}

而如果我直接点击 index.html 路径,则可以通过此路线访问

http://localhost:8080/index.html

标签: clojurering

解决方案


您收到错误No implementation of method: :write-body-to-stream of protocol: #'ring.core.protocols/StreamableResponseBody found for class: clojure.lang.PersistentArrayMap是因为作为主体返回 PersistentArrayMap 而不是可以编码为 Ring HTTP 响应主体的内容。

resource-response已经返回一个完整的响应映射(一个 PersistentArrayMap):

(resource-response "index.html")
;; => {:status 200,
;;     :headers
;;     {"Content-Length" "0", "Last-Modified" "Mon, 16 Nov 2020 14:22:48 GMT"},
;;     :body
;;     #object[java.io.File 0x239d3777 "/index.html"]}

因此无需将其包装起来,{:status 200, :body ...}因为它会{:status 200 :body {:status 200, ...}}导致该错误。要修复它,您的 API 可以直接返回:

(resource-response "index.html" {:root "public"})

推荐阅读