2

私は Node.js を学んでおり、コア機能を学習するための The Node Beginner Book などのチュートリアルをいくつか読みました。しかし、いくつかの例を読めば読むほど、疑問が募り始めます。

チュートリアルから取得したさらなる例では、 key の CRUD 'read' リクエストに対して/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()function には req,res,next の 3 つのパラメーターがありますが、少なくともapp.get()「req」パラメーターからloadUser(). それはどこから来るのですか?
  2. 関数内loadUser()で を実行next()すると、関数はその手順を続行できることを意味しapp.get()ますが、この req.currentUser = user は、app.get()関数で使用されるのと同じ req ですか?
  3. 関数内でコードloadUser()を実行すると、関数res.redirect()のプロシージャが自動的に中断されapp.get()ますよね?には戻らないようDocument.find()です。
4

2 に答える 2

9

あなたが尋ねた質問は、具体的にはExpressフレームワークの内部に関するものです。

  1. app.get(route, loadUser, final) を呼び出すと、Express は loadUser 関数と final 関数でスタック (配列) を作成し、next を呼び出すとスタック内の次の関数を同じ req で実行する必要があることを認識します。および res パラメータ。

  2. next を呼び出すと、ミドルウェア スタック内の次の関数に渡されます。

  3. res.redirect を呼び出し、return を呼び出さないため、スタック内の次の関数 (Document.find を持つ関数) には渡されません。

資力:

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

于 2012-06-04T13:22:06.740 に答える
0

これに慣れるには、ミドルウェアの考え方と、それが接続フレームワークでどのように使用されるかを理解する必要があると思います。

この主題が十分に説明されている記事はほとんど見つかりませんでした。そこを見てください:

http://howtonode.org/connect-it とここhttp://stephensugden.com/middleware_guide/

主なアイデアは、レイヤーのセットがあり、新しいリクエストが到着するたびに各レベルを通過し、各レベルでそれをどうするかを決定できるということです。あるレベルで停止し、何かをして応答を返すか、次のレイヤーに渡すことができます

于 2015-08-06T19:33:40.760 に答える