2014-04-22 4 views
1

헤더 값이있는 요청 맵에서 일부 확인을 수행하는 링 미들웨어가 있습니다. 확인을 위해 데이터베이스에 접속해야합니다.특정 경로 그룹에 링 미들웨어를 적용하는 방법은 무엇입니까?

a가 공용 URI 패턴으로 시작하는 라우트 세트로 defroutes하는 경우. 처리하기 전에 패턴과 일치하는 임의의 URL에 대해 미들웨어를 실행하지 않으려합니다.

필자는 defroutes 내부에서만 고소하고있는 특정 URI 세트에 대해서만 미들웨어를 실행하기를 원합니다. 그 이유는 동일한 패턴을 가진 404 응답을 피하기 위해 미들웨어에 데이터베이스 액세스가 있기 때문입니다.

답변

1

여기에는 구성 가능성과 확장 성을 목적으로하는 매크로 매직이없는 링 핸들러 인 comporoute이 있습니다.

초기 알파 상태이지만 정확한 문서 문자열이 이미 있습니다. 현재 가지고있는 문제를 해결하기 위해 내부 미들웨어이라는 기능이 있습니다. 필요로하는 용도로만 사용할 수 있으며, 나머지는 Compojure에 맡길 수 있습니다.

당신의 Compojure 핸들러 감안할 때/응용 프로그램은 compojure라고 : 쉘에서

(defn demo-middleware 
    "A test midleware associng :bar to :foo of request" 
    [handler] 
    (fn [request] 
    (handler (assoc request :foo :bar)))) 

(defn demo-handler [request] 
    (ring.util.response/response 
    (str "id is " (get-in request [:params :id]) " " 
      ":foo is" (:foo request)))) 

(def app 
    (comporoute.core/router 
    [["/demo-with-middleware" 
     [demo-middleware ;; all handlers in this vector are 
         ;; wrapped via demo-middleware 
     ["/:id" :demo-with demo-handler]]] 
    ["/demo-without-middleware" 
     ["/:id" :demo-without demo-handler]]] 
    :page-not-found compojure) 

curl http://localhost:8080/demo-without-middleware/1234 
id is 1234 :foo is 

curl http://localhost:8080/demo-with-middleware/1234 
id is 1234 :foo is :bar 

# Everything else will be handled by compojure. 

종속성 벡터 [comporoute "0.2.0"]

+0

내가 RO 다시이 모든 기존 노선 코드를 작성해야합니까 스타일 또는 정의 부분 (모든 "/ xyz/*"[] (my-middleware xyz-routes))) 문법의 종류? –

+0

방금 ​​답변을 업데이트했습니다. 미들웨어가 필요한 경로를 별도의 단열재에 넣으십시오. –

+0

이것은 나를 위해 작동하지 않습니다. 예를 들어 내가 요청을하면 db/blahblahblah db-routes에/blahblahblah가 없으면 미들웨어를 먼저 호출 한 다음 경로의 db-routes를 확인하고 찾을 수없는 경우 404를 반환합니다. –

관련 문제