152

next()メソッドが何をするかについての適切な説明を見つけようとしています。Express のドキュメントでは、next('route')そのルートにジャンプしてその間のすべてのルートをスキップするために使用できると書かれていますが、next引数なしで呼び出されることもあります。next関数を説明する優れたチュートリアルなどを知っている人はいますか?

4

9 に答える 9

193

next()引数なしは、「冗談です。実際にはこれを処理したくありません」と言います。戻って、一致する次のルートを見つけようとします。

これは、たとえば、URL スラッグを含むある種のページ マネージャーやその他の機能が必要な場合に便利ですが、例を次に示します。

app.get('/:pageslug', function(req, res, next){
  var page = db.findPage(req.params.pageslug);
  if (page) {
    res.send(page.body);
  } else {
    next();
  }
});

app.get('/other_routes', function() {
  //...
});

その作成されたコードは、特定の id slug を持つページのデータベースをチェックする必要があります。1 つ見つかったらレンダリングします。見つからない場合は、このルート ハンドラーを無視して、他のハンドラーを確認します。

したがってnext()、引数がない場合は、ルートを処理しなかったふりをして、代わりに他の何かが取得できるようにすることができます。


または でヒットカウンターapp.all('*')。これにより、いくつかの共有セットアップ コードを実行してから、他のルートに移動してより具体的なことを行うことができます。

app.all('*', function(req, res, next){
  myHitCounter.count += 1;
  next();
});

app.get('/other_routes', function() {
  //...
});
于 2012-10-30T05:26:37.467 に答える
143

ほとんどのフレームワークでは、リクエストを受け取り、レスポンスを返す必要があります。Node.js の非同期の性質により、重要なことを行っている場合、ネストされたコールバックで問題が発生します。これが起こらないようにするために、Connect.js (v4.0 より前では、Express.js は connect.js の上のレイヤーでした) には、2、3、または 4 つのパラメーターを持つ関数であるミドルウェアと呼ばれるものがあります。

function (<err>, req, res, next) {}

Express.js アプリは、これらの関数のスタックです。

ここに画像の説明を入力

ルーターは特別で、特定の URL に対して 1 つ以上のミドルウェアを実行できるようにするミドルウェアです。つまり、スタック内のスタックです。

では、次に何をしますか?シンプルです。次のミドルウェアを実行するようにアプリに指示します。しかし、何かを next に渡すとどうなるでしょうか。Express は現在のスタックを中止し、4 つのパラメーターを持つすべてのミドルウェアを実行します。

function (err, req, res, next) {}

このミドルウェアは、エラーを処理するために使用されます。私は次のことをするのが好きです:

next({ type: 'database', error: 'datacenter blew up' });

このエラーが発生した場合、おそらくユーザーに何か問題が発生したことを伝え、実際のエラーをログに記録します。

function (err, req, res, next) {
   if (err.type === 'database') {
     res.send('Something went wrong user');
     console.log(err.error);
   }
};

Express.js アプリケーションをスタックとして描くと、多くの奇妙さを自分で修正できる可能性があります。たとえば、ルーターの後に Cookie ミドルウェアを追加する場合、ルートに Cookie がないことは理にかなっています。

ドキュメント

エラー処理ミドルウェアは、引数が 3 つではなく 4 つであることを除いて、他のミドルウェアと同じ方法で定義します。具体的には署名 (err、req、res、next):

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})
于 2012-10-30T18:41:16.157 に答える
11

パラメーターなしの next() は、フレームワーク内の次のルート ハンドラーまたは次のミドルウェアを呼び出します。

于 2015-06-24T20:23:43.377 に答える