clojure/ring/jetty:我正在使用 > lein 环服务器。如何配置实例化的jetty实例?

2024-01-04

当我直接调用码头处理程序时,我能够传入一个配置器,如下所示:

(def header-buffer-size 8388608)
(defn start [port]
  (ring/run-jetty
   (var app)
   {:port port
    :join? false
    :host "127.0.0.1"
    :configurator
    (fn [jetty]
      (doseq [connector (.getConnectors jetty)]
        (.setHeaderBufferSize connector header-buffer-size)))}))

我必须这样做,因为我在发帖时不断收到 FULL HEAD 错误。现在我重构了直接使用> leinring服务器的东西,它从命令行调用。

> lein ring server

这使用了我的project.clj中指定的一些配置:

:ring {:handler caribou.api.core/app
       :servlet-name "caribou-api"
       :init caribou.api.core/init
       :port 33443}

这很好用,但现在我又遇到了全头问题。所以我尝试在其中添加一个配置器:

:ring {:handler caribou.api.core/app
       :servlet-name "caribou-api"
       :init caribou.api.core/init
       :configurator
       (fn [jetty]
         (doseq [connector (.getConnectors jetty)]
           (.setHeaderBufferSize connector 8388608)))
       :port 33443})

这个堆栈跟踪失败了:

Exception in thread "main" java.lang.ClassCastException: 
clojure.lang.PersistentList cannot be cast to clojure.lang.IFn
  at ring.adapter.jetty$run_jetty.invoke(jetty.clj:66)
  at ring.server.standalone$serve$fn__833.invoke(standalone.clj:78)
  at ring.server.standalone$try_port.invoke(standalone.clj:12)
  at ring.server.standalone$serve.doInvoke(standalone.clj:75)
  at clojure.lang.RestFn.invoke(RestFn.java:423)
  at ring.server.leiningen$serve.invoke(leiningen.clj:20)

我认为这与将函数直接放在地图中有关,所以我在项目外部(在 caribou.api.core 中)定义了它,并尝试像我在其他地方定义的其余函数一样引用它:

;; in caribou/api/core.clj
(def header-buffer-size 8388608)
(defn full-head-avoidance
  [jetty]
  (doseq [connector (.getConnectors jetty)]
    (.setHeaderBufferSize connector header-buffer-size)))

;; in project.clj
:ring {:handler caribou.api.core/app
       :servlet-name "caribou-api"
       :init caribou.api.core/init
       :configurator caribou.api.core/full-head-avoidance
       :port 33443})

这会启动应用程序,但我在发布时仍然收到 413: FULL HEAD 错误。有任何想法吗?谢谢!


里面写的东西defproject默认情况下不评估表单,但您可以使用~(取消引用)在defproject当您需要它时:

(defproject foo "1.2.3"
  ...
  :some-fn-key ~(fn [& args] ...))

在这种特殊情况下,您可以取消引用fn定义配置器函数的形式(如果不取消引用,则将其用作包含一堆符号的列表,而不是编译成函数)。

或者,您可以在外部定义配置器defproject表格并在里面引用它的名称defproject就像你的第二种方法一样,但是你需要取消引用里面的名称defproject-- 否则它将被视为一个符号。注意。在后一种情况下不会产生异常,因为符号实际上是可调用的并接受任意参数(但只返回nil当用地图或集合以外的东西调用时;对于地图或集合,他们在自己的论点中查找自己)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

clojure/ring/jetty:我正在使用 > lein 环服务器。如何配置实例化的jetty实例? 的相关文章

随机推荐