繁体   English   中英

基座不服务于 static 资源

[英]Pedestal Doesn't serve static resource

我正在尝试在此处提供的 Pedestal 教程应用程序上进行构建。

我正在尝试添加 cljs 功能并尝试设置统一的 clojurescript 和 clojure 环境。

我的 deps.edn 文件如下所示:

{:paths ["src"]
 :deps {io.pedestal/pedestal.service {:mvn/version "0.5.7"}
    io.pedestal/pedestal.route   {:mvn/version "0.5.7"}
    io.pedestal/pedestal.jetty   {:mvn/version "0.5.7"}
    org.slf4j/slf4j-simple       {:mvn/version "1.7.28"}
    org.clojure/core.async       {:mvn/version "1.3.610"}
    org.clojure/tools.namespace  {:mvn/version "1.1.0"}
    org.clojure/tools.logging    {:mvn/version "1.1.0"}
    org.clojure/data.json        {:mvn/version "1.1.0"}
    org.clojure/clojurescript    {:mvn/version "1.10.758"}
    thheller/shadow-cljs         {:mvn/version "2.11.23"}
    selmer/selmer                {:mvn/version "1.12.33"}
    hiccup/hiccup                {:mvn/version "1.0.5"}}
 :mvn/repos {"central"  {:url "https://repo.maven.apache.org/maven2/"}
         "clojars"  {:url "https://clojars.org/repo/"}}}

我的 Shadow-cljs.edn 文件如下

{:source-paths ["src/cljs"]
 :nrepl {:port 9000}
 :dependencies [[cider/cider-nrepl "0.21.0"]]
 :builds {:app {:target :browser
            :output-dir "resources/public/js"
            :modules {:main {:init-fn frontend.core/init-fn}}}}}

我的文件夹结构如下所示:

在此处输入图像描述

该网站与基座教程没有任何不同,除了使用 selmer 渲染 HTML 模板以创建带有“Hello, World”或“Hello.name.”的 H1 标签。 在 html 中,我包含了由 shadow-cljs 从 clojurescript 生成的 main.js。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Hello, {{name}}</h1>
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>

我的 core.clj 具有以下路由定义

(def routes
(route/expand-routes
  #{["/hello" :get [coerce-body content-neg-intc respond-hello] :route-name :greet]
    ["/echo" :get echo]}))

(defn create-server
     []
   (http/create-server
       {::http/routes routes
        ::http/type   :jetty
        ::http/port   8800
        ::http/join?  false
        ::http/resource-path  ["resources/public" "resources/public/js" "resources/public/js/cljs-runtime"]
        ::http/secure-headers {:content-security-policy-settings {:object-src "none"}}}))

如您所见,我已在资源路径中添加了资源文件夹。

我能够在并行终端中运行 shadow-cljs 和 clj 并按如下方式托管服务器: 在此处输入图像描述

当我查看托管页面的 chrome 时,我得到以下信息。 在此处输入图像描述

无论我做什么,我都无法将资源中的公用文件夹添加到客户端上的 html 路径。 这样我就无法使用页面加载 main.js。 这是为什么? 我是 clojure 和基座的新手,所以也许我遗漏了一些明显的东西。 请问有人可以帮我解决这个问题吗? 我不确定如何进行。 Pedestal 文档在这方面不是很详细。

  • 安倍

您的设置有两个问题:

  1. ::http/resource-path采用单个元素而不是向量。
  2. 正如键名所示,路径必须是 Java 意义上的资源:文件实际上是由 ClassLoader 加载的(资源可能在 jar 文件中)。

在您的情况下,您可以执行以下操作:

  1. 在 deps.edn 文件中的:src中添加"resources" (maven 存储库配置不是必需的,因为 maven 中央和 clojars 始终包括在内);

  2. 使用"public"作为键::http/resource-path的值。

您的 edn 文件变为:

{:paths ["src" "resources"]
 :deps {io.pedestal/pedestal.service {:mvn/version "0.5.7"}
    io.pedestal/pedestal.route   {:mvn/version "0.5.7"}
    io.pedestal/pedestal.jetty   {:mvn/version "0.5.7"}
    org.slf4j/slf4j-simple       {:mvn/version "1.7.28"}
    org.clojure/core.async       {:mvn/version "1.3.610"}
    org.clojure/tools.namespace  {:mvn/version "1.1.0"}
    org.clojure/tools.logging    {:mvn/version "1.1.0"}
    org.clojure/data.json        {:mvn/version "1.1.0"}
    org.clojure/clojurescript    {:mvn/version "1.10.758"}
    thheller/shadow-cljs         {:mvn/version "2.11.23"}
    selmer/selmer                {:mvn/version "1.12.33"}
    hiccup/hiccup                {:mvn/version "1.0.5"}}}

您的服务器配置变为:

(defn create-server
     []
   (http/create-server
       {::http/routes routes
        ::http/type   :jetty
        ::http/port   8800
        ::http/join?  false
        ::http/resource-path  "public"
        ::http/secure-headers {:content-security-policy-settings {:object-src "none"}}}))

请参阅http://pedestal.io/cookbook/index#_how_to_serve_static_resources 特别注意,Pedestal 的 http/resource-path 不是文件系统位置,而是 URL 路径前缀,Pedestal 应该通过该前缀识别它应该从类路径中赎回的东西。

也许你应该仔细检查你的 deps.edn 并确保它包含

:paths ["src" "resources"]

我遇到了和你一样的问题,直到我发现我把“路径”写错了“路径”,这会导致服务器找不到 static 资源路径。 祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM