2017-05-23 10 views
1

私は次のルートで間違ったつもりだところ、私は理解することはできません:私はのようになりますJSONオブジェクトとレスポンスボディを返すようにしようとしている(試行)式の中からリングルートの応答本文を返すにはどうすればよいですか?

(ns mds.routes.api 
(:require [mds.db.core :refer [*db*] :as db] 
      [compojure.core :refer [defroutes POST]] 
      [ring.util.http-response :as response] 
      [clojure.walk :as walk])) 

(defroutes api-routes 
    (POST "/student" request 
     (let [{body :body} request] 
     (let [student (walk/keywordize-keys body)] 
      (try 
      (db/create-student! student) 
      {:saved true 
       :error nil 
       :student student} 
      (catch Exception e {:saved false 
            :error e 
            :student nil}) 
      ))))) 

{ 
    "saved":"true", 
    "error":"nil", 
    "student": {...} 
} 

しかし、私はちょうど空の応答のボディを取得しています。 db/create-student!呼び出しは正常に動作し、JSON本体または500エラーのいずれかが表示されますが、(try)式を使用すると、毎回空のステータス200応答が返されます。

(try)式を取得してマップを返し、それを応答ハンドラに渡すにはどうすればよいですか?

+0

他にも違いがあるかどうかを確認するために、 'try'も含めないコードを含めることができますか? –

答えて

1

何らかの理由で例外がスローされない限り、試行で空の応答を引き起こす原因を推測するのは難しいです。たぶん、タイプミスや名前変更された機能のために、実行中のものとソースファイル内のものには違いがあります。考慮すべきことの1つは、ハンドラと同様にミドルウェアスタックの上に例外をスローすることができることです。

clojureデータ構造(.edn)からの応答をjsonに変換するミドルウェアでラップされている場合、そのミドルウェアは例外をスローして例外をシリアル化しようとしている可能性があります。この場合、e

(defroutes api-routes 
    (POST "/student" request 
     (let [{body :body} request 
       student (walk/keywordize-keys body)] 
      (try 
      (db/create-student! student) 
      {:saved true 
      :error nil 
      :student student} 
      (catch Exception e {:saved false 
           :error (.getMessage e) 
           :student nil}))))) 

とキャッチ式の応答を生成しながら、スローされる例外について例外を出力/ログ/ nrepl-バッファをチェック:テストとしてこれを試してみてください。あなたが他の場所で任意のJSONレスポンス形成ミドルウェアを持っていない場合

、このような何かを試してください:あなたが明示的にレスポンスコードを設定して起こっていただきました!あなたが把握できるかどうかを確認

(defroutes api-routes 
    (POST "/student" request 
     (let [{body :body} request 
       student (walk/keywordize-keys body)] 
      (try 
      (db/create-student! student) 

      {:status 200 
      :body (str {:saved true 
         :error nil 
         :student student})} 
      (catch Exception e {:status 401 
           :body (str {:saved false 
              :error (.getMessage e) 
              :student nil})}))))) 

0

コード全体をExceptionクラスで囲んでいるので、それはあまりにも広いので、悪い習慣です。これは、ファイルの欠落、構成の誤り、引数の無効化、その他のアーキテクチャ上のエラーなど、実際に重要なエラーを表示するのを防ぎます。

しかし、あなたが本当にすべての例外をキャッチする必要がある場合は、少なくともあなたは、どちらかのプリントまたは何が起こっているかを確認するためにスタックトレースを返すことがあります。

eは、あなたの例外インスタンスである
(ns foo 
    (require [clojure.stacktrace :as trace])) 

... 

;; your handler goes here 
(let [trace-string (with-out-str 
        (trace/print-throwable e))] 
    {:status 500 
    :body trace-string}) 

関連する問題