2014-06-14 63 views
1

我曾尝试使用以下组件继承了Clojure的应用程序:Clojure的Web应用程序:如何逐步完成请求

  • Jetty服务器
  • 的Compojure

为了获得一个对应用程序的理解,我想逐步通过请求。 我使用Emacs作为我的IDE。

是否有任何工具或技术可以用来完成此操作?

回答

1

不幸的是,Clojure没有任何现成的步调试器。可以使用jdb连接到jvm,并逐个查看字节码,但这不会直接反映您的Clojure代码(特别是感谢懒惰等原因,可能会导致应用程序中的不同上下文评估某些代码,而不是源代码布局会让你期待)。

虽然没有丢失。由于强烈关注在惯用Clojure代码中使用不可变数据和纯函数,因此可以直接捕获函数在运行时获得的输入值,以便调查和/或实验新值。例如:

核心命名空间中,你定义你的处理器和发射码头,并开始从同一进程的nrepl服务器:

(ns my-server.core 
    (:require [ring.middleware 
      [json :refer (wrap-json-params)] 
      [multipart-params :refer (wrap-multipart-params)]] 
... 
      [clojure.tools.nrepl.server :as nrepl-server])) 

... 

(defn init 
    [] 
    (when (= (System/getProperty "with_shell") "true") 
    (nrepl-server/start-server :port 7888)) 
    (run-jetty handler :port 8080)) 

的代码命名空间中服务于特定的请求,你可以跟踪输入数据,以使用/调查它在REPL

(ns my-ns.controllers.home) 

(defonce debug (atom [])) 

(defn home 
    [request] 
    (let [in (java.util.Date.) 
     response (process request) 
     out (java.util.Date.)] 
    (swap! debug conj {:in request :out response :fn home :timing [in out]}) 
    response)) 

然后,从REPL连接,您可以查询我的-ns.controllers.hom /调试的状态,通过derefing原子和看到各种输入和输出值。这可以概括为调查各种中间值的内容,无论你想跟踪执行。由于数据对象通常不是不可修饰的,所以如果创建一个原子来存储这些值,那么可以有一个完整的记录。请注意,通过在计算请求之前和之后创建时间戳,您可以剖析请求处理函数正文的执行情况(为了清晰起见,我已将其抽象为单个函数)。

如果您想使用基于打印的跟踪,还有类似clojure.tools.trace的库。

相关问题