2024 年 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面以了解更多关于如何使用本网站的信息。

0

编辑

我在设置一个返回JSON格式的服务,多亏了Ring、Compojure和Jetty。我遇到的问题是,当我想要使用Nginx作为反向代理时,如果您使用以下处理器则无法正常工作。

(def wrapped-handler
  ;; Handler middlewares
  (-> all-routes
      (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))
      wrap-params
      wrap-session
      ))

我收到的信息是

java.lang.NullPointerException
        at ring.adapter.jetty$proxy_handler$fn__6990.invoke(jetty.clj:26)
        at ring.adapter.jetty.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle(Unknown Source)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
        at org.eclipse.jetty.server.Server.handle(Server.java:503)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
        at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
        at java.base/java.lang.Thread.run(Thread.java:834)

但如果添加wrap-reload,一切就会正常。

(def wrapped-handler
  ;; Handler middlewares
  (-> all-routes
      (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))
      wrap-params
      wrap-session
      (#(if (config :debug) (wrap-reload %)))
      ))

我的Nginx配置如下。

server {        

        server_name domain.com;

        location / {
            proxy_pass https://127.0.0.1:9000/;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_redirect  off;
        }
}

在生产中留下wrap-reload安全吗?
我留下了什么?

提前感谢各位。

1 答案

0

仅凭这些信息很难判断。在像Clojurians Slack这样的交互式环境(人们可以向您询问更多信息并实时进行尝试)中调试此类问题要容易得多。

https://clojurians.slack.com -- 自动注册: http://clojurians.net

我认为您绝对不希望在生产中运行wrap-reload

发表于
问题已解决,感谢建议。

我遇到了以下问题

(#(if (config :debug) (wrap-reload %)))

这产生了空值并中断了执行过程。解决方案是

(#(if (config :debug) (wrap-reload %) %))

或者使用 cond->

(cond-> (config :debug) wrap-reload)))
发表于
嗯,我第一次看帖子时没看到这个条件表达式...

cond-> 非常适合这类事情(并且比尝试把代码拼接到匿名函数中更容易阅读!)
...