2014-12-31 2 views
0

Express.js 응용 프로그램에서 사용자 정의 유효성 검사 및 매개 변수 구문 분석이 있습니다. 내 경로 중 하나에 대해 obj_id가 경로의 일부로 제공 될 것으로 기대하고 있습니다. mongoose가 DB에서 해당 ID를 가진 obj를 찾지 못하면 404 오류를 반환합니다. router.use 호출 전에 router.param 호출을 두었으므로 먼저 param 유효성 검사가 실행될 것으로 기대됩니다. 그러나 node-inspector를 사용하면 사용자 정의 미들웨어를 사용하기 전에 param 함수에 도달하지 않았는지 확인할 수 있습니다.ExpressJS : Router.param() 및 Router.use()의 미들웨어 제어 흐름

미들웨어보다 먼저 구문 분석을 수행하려면 어떻게해야합니까?

이 미들웨어는 여러 기능에서 사용되고 있으므로 라우터 호출에 추가하고 싶지 않습니다.

router.param('obj', function(req, res, next, id){ 
    Obj.findOne({_id: id}, function(err, obj){ 
    if (err || !obj) { 
     res.status(404).json({error: {message: "No obj with that ID", type: "bad_parameters.unknown_obj"}}); 
    } else { 
     req.obj = obj; 
     next(); 
    } 
    }); 
}); 

router.use(function(req,res,next){ 
    ... 
    //Do some validations 
    ... 
    if(error) return res.status(400).json(error); 
    next(); 
}); 
... 
//Other routes that are working well 
... 
router.get('/:obj', obj); 

예상 오류 :

404 {error: {message: "No obj with that ID", type: "bad_parameters.unknown_obj"}} 

실제 오류 : 당신의 도움에 미리

400 {error: {message: "Validation failed", type: "bad_parameters"}} 

감사합니다!

+1

'미들웨어/경로 스택 실행이 자리를 포함하는 경로 처리기에 도달 할 때 param' 핸들러가 실행됩니다. 실제 라우트 핸들러보다 먼저 router.get()'*에 대한 또 다른 인자로서 미들웨어를 옮겨 보았습니까? – mscdex

답변

1

router.use()를 사용하여 미들웨어 스택에 연결하고 라우터가 정의 된 경로에 대한 요청에 의해 트리거 될 때마다 선언 순서대로 실행됩니다.

router.use()router.all()으로 바꾸면 router.param() 뒤에 실행됩니다. 그래서 당신은 같은 작업을 수행 할 수 있습니다

router.route('/:obj') 
      .all(validationMiddleware) 
      .get(getHandler); 
router.param('obj', resolveObj);