在使用Lein和Ring时,Clojure中缺少*out*。

6

我正在使用 Lein 2 和 cider 0.7.0。我创建了一个简单的 Ring 应用程序,使用 ring/run-jetty 启动。

(ns nimbus-admin.handler
  (:require [compojure.core :refer :all]
            [compojure.handler :as handler]
            [clojure.tools.nrepl.server :as nrepl-server]
            [cider.nrepl :refer (cider-nrepl-handler)]
            [ring.adapter.jetty :as ring]
            [clojure.tools.trace :refer [trace]]
            [ring.util.response :refer [resource-response response redirect content-type]]
            [compojure.route :as route])
  (:gen-class))


(defroutes app-routes 
  (GET "/blah" req "blah")
  (route/resources "/")
  (route/not-found (trace "not-found" "Not Found")))

(def app (handler/site app-routes))

(defn start-nrepl-server []
  (nrepl-server/start-server :port 7888 :handler cider-nrepl-handler))

(defn start-jetty [ip port]
  (ring/run-jetty app {:port port :ip ip}))

(defn -main
  ([] (-main 8080 "0.0.0.0"))
  ([port ip & args] 
     (let [port (Integer. port)]
       (start-nrepl-server)
       (start-jetty ip port))))

然后使用Cider连接它,如下:

cider-connect 127.0.0.1 7888

我可以在emacs中导航到我的网站并评估表单,它将更新正在运行的nrepl会话中的内容,这很棒。

我无法看到输出,无论是使用(print "test") (println "test") (trace "out" 1)

最后,我的项目文件:

(defproject nimbus-admin "0.1.0"
  :description ""
  :url ""
  :min-lein-version "2.0.0"
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [com.climate/clj-newrelic "0.1.1"]
                 [com.ashafa/clutch "0.4.0-RC1"]
                 [ring "1.3.1"]
                 [clj-time "0.8.0"]
                 [midje "1.6.3"]
                 [org.clojure/tools.nrepl "0.2.6"]
                 [ring/ring-json "0.3.1"]
                 [org.clojure/tools.trace "0.7.8"]
                 [compojure "1.1.9"]
                 [org.clojure/data.json "0.2.5"]
                 [org.clojure/core.async "0.1.346.0-17112a-alpha"]
                 ]
  :plugins [[lein-environ "1.0.0"]
            [cider/cider-nrepl "0.7.0"]]
  :main nimbus-admin.handler)

我使用lein run启动站点。

编辑 只有在使用(.println System/out msg)时,我才能看到输出。

4个回答

3
你尝试过(.println System/out msg)吗?我之前遇到了同样的问题,这个方法对我很有用。

好的,那个可以工作!但是其他三个不行!这里出了什么问题?! - Steve
希望我知道。我相信问题是由于尝试通过多个线程打印引起的。不确定为什么我的方法有效而其他方法失败。Clojure邮件列表可能更好。 - Chris

1

您可以手动在代码中添加打印语句。 如果想要打印有关每个请求的信息,可以添加中间件。 您传递给Jetty的处理程序是从Ring请求到Ring响应的函数。 Ring请求和响应只是映射,有关它们应包含的键,请参见 Ring规范。 中间件只是一个函数,它将处理程序作为其第一个参数,并返回处理程序。

打印有关请求和响应基本信息的中间件函数示例:

(defn log-middleware [handler]
  (fn [request]
    (let [response (handler request)]
      (println "=>" (name (:request-method request)) ":" (:uri request))
      (println "<=" (:status request))
      response)))

这个中间件应该会输出到cider repl缓冲区,但是cider有时会表现奇怪,并将输出发送到*Messages*或nrepl服务器缓冲区。

您可以通过将此中间件应用于处理程序来使用它:

 (def application (log-middleware (handler/site routes)))

标题可以通过以下方式打印:只需从请求映射中获取:headers字段并将其打印出来。

当我在我的代码中放置 "clojure.tools.trace/trace"、"println" 或 "print" 语句时,它们似乎无处可见。它们不会显示在我的cider缓冲区或正在运行的站点日志中。当我使用cider-jack-in或cider-connect连接到正在运行的站点时,这也不起作用。 - Steve

0

在你的print表达式后使用(flush)来强制输出。


0

Prone 库可能会对您有所帮助。它具有用于更好的异常报告的环形中间件,还具有调试功能。在调试时,您可以检查任何本地绑定以及 Ring 请求。

这里有一个视频演示它的工作原理


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接