4

在 Java 1.7.0_21 Java HotSpot(TM) 64 位服务器 VM 上运行 Leiningen 2.3.4

我无法连接到 nREPL 服务器。

我使用 设置了一个新项目lein new luminus,然后将依赖项添加到吊桥 ( [com.cemerick/drawbridge "0.0.6"])。

我为 repl 添加了一个处理程序路由,如下所示(基于https://devcenter.heroku.com/articles/debugging-clojure):

(def drawbridge-handler
  (-> (cemerick.drawbridge/ring-handler)
      (wrap-keyword-params)
      (wrap-nested-params)
      (wrap-params)
      (wrap-session)))

(defn wrap-drawbridge [handler]
  (fn [req]
    (if (= "/repl" (:uri req))
      (drawbridge-handler req)
      (handler req))))

并添加wrap-drawbridge到我的中间件中。

然后我使用启动服务器

lein ring server-headless

连接似乎运行良好,因为执行 GET 请求会http:localhost:3000/repl产生响应:["[\n","\n]"]

但我无法连接到 REPL:

> lein repl :connect 0.0.0.0:3000/repl
Connecting to nREPL at 0.0.0.0:3000/repl

而且,过了一段时间:

SocketException The transport's socket appears to have lost its connection to the nREPL server
    clojure.tools.nrepl.transport/bencode/fn--4287/fn--4288 (transport.clj:95)
    clojure.tools.nrepl.transport/bencode/fn--4287 (transport.clj:95)
    clojure.tools.nrepl.transport/fn-transport/fn--4261 (transport.clj:42)
    clojure.core/binding-conveyor-fn/fn--4107 (core.clj:1836)
    java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:334)
    java.util.concurrent.FutureTask.run (FutureTask.java:166)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)
    java.lang.Thread.run (Thread.java:722)
Bye for now!

我错过了什么吗?

编辑:

将以下日志记录代码添加到我的处理程序:

(defn wrap-drawbridge [handler]
  (fn [req]
    (if (= "/repl" (:uri req))
      (do (println "IN REPL ")
        (drawbridge-handler req))
      (handler req))))

按照建议连接时lein repl :connect http://localhost:3000/repl,我看到IN REPL在服务器控制台上以无限循环打印该行。

4

3 回答 3

5

不是一个直接的答案,但我发现我没有以正确的方式解决这个问题。

Luminus 创建了一个project-name.repl应该用于交互式开发的命名空间。

我发现我可以通过添加到我的project.clj

:repl-options {
                  :init-ns project-name.repl
                  :init (start-server)}

然后只需使用lein repl.

比设置 nREPL 中间件简单得多!

于 2013-11-20T22:27:52.860 回答
1

您是否确定确实有一个请求进入您的服务器(例如通过 printlining)?

但是,我的第一个猜测是,它lein repl :connect的行为会有所不同,具体取决于您传递的是 IP/端口对还是完全限定的 URL。由于drawbridge似乎可以通过 HTTP 访问 nREPL,我建议您尝试:

lein repl :connect http://localhost:3000/repl
于 2013-11-20T09:07:25.447 回答
0

您需要wrap-drawbridge在中间件列表的第一个位置添加。

如果你做这样的事情

(def app (-> #'all-routes
               wrap-drawbridge
               ...
               ...
               ...
               ))

它就像一个魅力。

于 2014-09-23T15:39:47.430 回答