2013-07-18 4 views
2

요청의 모든 문자열 개체 ID를 ObjectId 개체로 변환하기위한 미들웨어를 작성하려고합니다.미들웨어 단계에서 경로 매개 변수에 대한 액세스

내가 사용하여이를 달성하고 다음이 JSON오고 모든 PARAMS을 위해 노력하고 있습니다

(defn get-object-id 
    [id] 
    (when (and (string? id) (re-matches object-id-regex id)) 
    (ObjectId. id))) 

(defn maybe-obj->object-id [obj] 
    (or (get-object-id obj) obj)) 

(defn- convert-string->object-ids [obj] 
    (cwalk/postwalk 
    (partial pcommon/maybe-obj->object-id) obj)) 

(defn warp-params-string->objectid 
    "convert strings to object ids" 
    [handler] 
    (fn [request] 
    (handler (update-in request [:params] convert-string->object-ids)))) 

는 등 PARAMS을 요청하지만이 예를 들어, 경로 PARAMS에 적용되지

: url에 대한 fst "/ : fst". 나는 GET 매크로를 보았고 route params는 그 매크로의 어딘가에 주입되었다. 그러나 GET/POST 등이 마지막으로 실행되기 때문에 나의 미들웨어는 이것들에 접근 할 수 없다. 이것을 달성하는 어떤 우아한 방법.

+0

아마 도중의 매개 변수를 얻으려면'(처리기 (update-in request ...)를 (update-in (요청 처리기) ... '로 변경하십시오.) – noisesmith

+0

@ noisesmith는 GET 요청을 처리하는 동안 해당 객체가 필요하기 때문에 도움이되지 않습니다. –

답변

2

이러한 /:foo/:bar -style 매개 변수는 URI의 패턴 일치 결과로 각 라우트 정의에 지정된 패턴으로 바인딩됩니다. 바깥 레이어는 패턴이 어떻게 보이는지조차 모릅니다. 따라서 이들을 미들웨어로 처리하는 것은 현실적으로 불가능합니다.

대신 매크로를 쓸 수, 당신은 추가로 Compojure의에 위임, GET & (주) 당신의 자신의 버전을 제공 할 수 있습니다, 당신의 경로 처리기 '몸을 감싸. 그것은 많은 핸들러에 도움이 될 수있을 테니까요 경우, with-preprocessed-params 말 본문이 param-processing 매크로에 래핑 된 매크로.

미들웨어의 추가 레이어에서이 전처리 결과를 사용하고 싶다면 정말 좋은 솔루션은 아닙니다. 이 경우 일치하는 실제 URI 경로 세그먼트를 코어 처리기 레이어에 그대로 남겨두면 미들웨어에서 다른 매개 변수 유형의 사전 처리를 수행 한 다음 GET & 변형을 사용하여 경로 매개 변수를 사전 처리 할 수 ​​있습니다 만.

+0

James Reeves와 이야기했습니다. 스레드에 대한 자세한 내용 : https://groups.google.com/forum/?hl=en# ! topic/compojure/o5l9m7nbGlE –