3

私はいくつかのclojureWebアプリの開発を開始し、Ring+Compojureを組み合わせて使用​​することにしました。最近、AppEngine-magic(https://github.com/gcv/appengine-magic)でGoogleAppengineを試すことにしました。ただし、appengine-magic(start関数を介して)とringのrun-jetty関数はどちらもパラメーターとして1つのハンドラーしか取りません。私はいくつかのハンドラーを実装しており、それらすべてをデプロイする方法を知りたいと思います。

よろしくお願いします、Ze

4

2 に答える 2

5

トップレベルのハンドラーは常に1つだけになります。結局のところ、ある概念レベルに複数のハンドラーがある場合でも、アプリは特定のリクエストにどのハンドラーを適用するかを決定する必要があるため、選択を行うルーチンは次のようになります。トップレベルのハンドラー。つまり、簡単な答えは、リクエストを調べて、アプリ内のいくつかのハンドラーの中から適切なハンドラーに渡す関数を提供する必要があるということです。その関数は、与えられるハンドラーrun-jetty(または同等のもの)です。

通常、Ring + Compojureを使用すると、特定のURIを処理するための基本的な(「内部」)ハンドラーと、ミドルウェアとして実装されたいくつかの特別な目的のハンドラー(たとえば、404)があります。前者はフォームで定義される傾向がありdefroutes、後者は高階関数です。

ミドルウェアハンドラーは、要求を確認した後、応答をすぐに返すか、ラップアラウンドされたハンドラーに委任するかを自分で決定します。ルートベースの「内部」ハンドラーは適​​切なURIをnil要求され、要求がそれらに意味をなさないことを示すために戻るオプションがあります(その時点で、残りのルートベースのハンドラーが試行nilされます。最終応答は通常、ミドルウェアの一部によって生成され、場合によっては404を返します。

私はここにCompojureに関する長い答えを書きました; おそらく、Compojureのルートベースのハンドラー定義のコツをつかむのに役立つかもしれません。

于 2010-12-17T06:25:48.913 に答える
1

これが最善のアプローチかどうかはわかりませんが、他のハンドラーをメインのハンドラーにラップするring.middleware関数を実装することになりました。

(defn wrap-ohandler [f handler]
  (fn [req]
    (let [ res (f req) ]
      (if (= res nil) (handler req) res))))

(def handler-wrapped 
  (-> #'main-handler
    (wrap-ohandler #'anotherhandler )
    (wrap-stacktrace)
    (wrap-params)))

これは機能しますが、これは良いアプローチですか?

于 2010-12-17T02:21:39.160 に答える