2012-06-04 2 views
2

나는 Node.js를 배우고 있으며 핵심 기능을 배우기위한 The Node Beginner Book과 같은 튜토리얼을 읽었습니다. 그러나 몇 가지 예를 읽을수록 컬렉션 수집에 대한 의구심이 커집니다. 튜토리얼로부터 얻어지는 또 다른 예에서 Express/Connect 미들웨어는 어떻게 작동합니까?

, 우리는 CRUD위한 것을 알 수 키 /documents/titles.json 요청을 '판독'우리 값 반환된다 :이 예에서

app.get('/documents/titles.json', loadUser, function(req, res) { 
    Document.find({ user_id: req.currentUser.id },[], { sort: ['title', 'descending'] }, 
    function(err, documents) { 
    res.send(documents.map(function(d) { 
     return { title: d.title, id: d._id }; 
    })); 
    }); 
}); 

를 함수 loaduser()은 인증 목적으로 사용 :

function loadUser(req, res, next) { 
    if (req.session.user_id) { 
     User.findById(req.session.user_id, function(err, user) { 
     if (user) { 
      req.currentUser = user; 
      next(); 
     } else { 
      res.redirect('/sessions/new'); 
     } 
     }); 
    } 
} 

내가 이해하지 못하는 것은 :

  1. node.js가 app.get을 실행하기 전에 loaduser 함수로 이동한다고 가정합니다. loadUser() 함수에는 세 개의 매개 변수가 있습니다. req, res, next,하지만 적어도, app.get()에서 "req"매개 변수를 loadUser()으로 전달하는 방법을 볼 수 없습니다. 어디서 올까요? 당신이 next()을 실행할 때
  2. 내부 loadUser() 기능, 그것은 함수 app.get()은 "그 절차를 계속 할 수 있다는 것을 의미하지만,이 req.currentUser = 사용자가 loadUser() 함수 내부 app.get() 기능?
  3. 에 사용되는 것과 동일한 REQ입니다, ? 당신이 res.redirect() 코드를 실행하면, 자동으로 Document.find()에 반환하지 않는 것처럼 바로 보이는, app.get() 기능의 절차를 나누기 당신이 질문 한 질문은 구체적으로 Express 프레임 워크 내부에 대한 있습니다
+0

첫 번째 코드 샘플은 다음과 같습니다. 비동기 함수에서 값을 분명히 반환 할 수 없습니다. 비동기 코드가 작동하는 방식이 아닙니다. 반환 값이 없습니다. 당신이 할 수있는 일은 다른 기능을 호출하는 것입니다. – Tomalak

답변

9

을 :.

  1. 당신은 loadUser 최종 기능 기능 app.get (경로, loadUser가 최종) Express는 스택 (배열)을 만들 것입니다 전화와 당신이 다음에 호출 할 때 다음과 같은 기능을 수행한다는 것을 알 때 동일한 req 및 res 매개 변수가있는 스택에서.

  2. 다음에 호출하면 미들웨어 스택의 다음 함수로 전달됩니다.

  3. res.redirect를 호출하고 return을 호출하지 않으므로 스택의 다음 함수 (Document.find가있는 함수)로 전달되지 않습니다.

자료 :

http://howtonode.org/getting-started-with-express

+0

, 답변 해 주셔서 대단히 감사합니다. 그것은 완전히 내 혼합 된 두뇌를 정리 :-). 안부. – user1106811

+5

허용 된 답변으로 표시해야합니다. – timoxley

0

난 당신이 미들웨어의 아이디어와 방법이 연결 프레임 워크에 사용되는에 익숙해 질 필요가 이것에 편안하게하기 위해 생각한다.

이 주제가 충분히 설명 된 기사는 거의 발견되지 않았습니다. 이보세요 :

http://howtonode.org/connect-it 여기 http://stephensugden.com/middleware_guide/

주요 아이디어는 당신이 층의 집합을 가지고 있고 때마다 새로운 요청이 각 레벨을 통과하고 각 수준에 당신이 무엇을 결정할 수 있습니다 도착했을 때 그것으로.어떤 레벨에서 멈추고 무언가를하고 응답을 보내거나 다음 레이어로 넘겨 줄 수 있습니다.