2014-03-12 24 views
6

Ich betreibe Lein 2 und Apfelwein 0.7.0. Ich habe eine Beispiel-Ring-App erstellt, die Ring/Run-Jetty zum Starten verwendet.Missing * out * in Clojure mit Lein und Ring

(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)))) 

dann, um es mit Cidre zu verbinden wie:

cider-connect 127.0.0.1 7888 

ich auf meiner Website und eval Formen in Emacs navigieren und es wird aktualisiert, was leben in meiner nrepl Sitzung ausgeführt wird, so dass groß ist .

Ich kann nicht sehen, Ausgang, entweder mit (print "test") (println "test") (trace "out" 1)

Schließlich meine Projektdatei:

(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) 

beginne ich die Seite mit lein run

bearbeiten I CAN-Ausgang sehen, nur, wenn mit (.println System/out msg)

Antwort

1

Es ist Es ist möglich, Druckanweisungen einfach manuell in Ihren Code einzufügen. Wenn Sie Informationen zu jeder Anfrage drucken möchten, können Sie Middleware hinzufügen. Der Handler, den Sie an den Anlegesteg übergeben, ist eine Funktion von Ringanforderungen an Ringantworten. Ringanforderung und Antworten sind nur Karten, siehe Ring spec für mehr, welche Schlüssel sie enthalten sollten. Middleware ist nur eine Funktion, die einen Handler als erstes Argument akzeptiert und einen Handler zurückgibt.

Beispiel einer Middleware-Funktion grundlegende Informationen über Anfragen und Antworten drucken:

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

Diese Middleware zum Cidre repl Puffer drucken soll, aber Cidre verhält sich seltsam manchmal und Ausgang zu *Messages* oder nrepl Server senden Puffer.

Sie verwenden diese Middleware, indem es Ihre Handler Anwendung:

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

Headers auf diese Weise gedruckt werden können: nur bekommt das :headers Feld die Anfrage Karte bilden und ausdrucken.

+0

Wenn ich die Anweisungen "clojure.tools.trace/trace" oder "println" oder "print" in meinen Code einfüge, erscheinen sie nirgendwo. Sie werden nicht in meinem Cider-Puffer oder dem Protokoll meiner laufenden Site angezeigt. Dies funktioniert auch nicht, wenn ich cider-jack-in oder cider-connect für die Verbindung zu einer laufenden Site verwende. – Steve

0

Die Prone Bibliothek kann Ihnen helfen. Es hat eine Ring-Middleware für bessere Ausnahmebedingungsberichte, die auch die Möglichkeit zum Debuggen bietet. Beim Debugging können Sie sowohl lokale Bindungen als auch die Ringanforderung prüfen. Hier

ist ein video, der zeigt, wie es funktioniert

3

Haben Sie (.println System/out msg) versucht? Ich hatte das gleiche Problem und das hat für mich funktioniert.

+0

OK, das funktioniert! Aber die anderen drei nicht! Was ist denn hier los?! – Steve

+0

Ich wünschte, ich wüsste es.Ich glaube, dass das Problem durch den Versuch verursacht wird, über mehrere Threads zu drucken. Nicht sicher, warum meine Methode funktioniert, während die anderen fehlschlagen. Die Clojure-Mailingliste könnte eine bessere Einstellung sein. – Chris

0

Verwenden Sie (flush) nach Ihrer print Ausdrücke, um die Ausgabe zu erzwingen.