【问题标题】:Missing *out* in Clojure with Lein and Ring使用 Lein 和 Ring 在 Clojure 中丢失 *out*
【发布时间】:2014-04-17 10:14:47
【问题描述】:

我正在运行 Lein 2 和苹果酒 0.7.0。我制作了一个使用 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-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)时看到输出

【问题讨论】:

    标签: clojure ring nrepl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你试过(.println System/out msg)吗?我遇到了同样的问题,这对我有用。

      【讨论】:

      • 好的,行得通!但其他三个没有!这是怎么回事?!
      • 希望我知道。我相信这个问题是由于试图通过多个线程打印造成的。不知道为什么我的方法有效而其他方法失败。 clojure 邮件列表可能会更好。
      【解决方案3】:

      Prone 库可以帮助您。它有一个环形中间件,用于更好地报告异常,也具有调试能力。调试时,您可以检查任何本地绑定以及 Ring 请求。

      这是一个 video,它演示了它是如何工作的

      【讨论】:

        【解决方案4】:

        可以手动将打印语句放入您的代码中。 如果要打印每个请求的信息,可以添加中间件。 您传递给码头的处理程序是一个从环请求到环响应的函数。 响铃请求和响应只是映射,请参阅Ring spec 了解更多它们应该包含哪些键。 中间件只是一个将处理程序作为其第一个参数并返回处理程序的函数。

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

        (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-jack-in 或 cider-connect 连接到正在运行的站点时,这也不起作用。
        猜你喜欢
        • 2019-01-21
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        相关资源
        最近更新 更多