Nodejs制御権移転next all

3467 ワード

Expressは、同じ経路で複数のルーティング応答関数をバインディングすることをサポートする.
app.all('/user/:username', function(req, res) {
res.send('all methods captured');
});
app.get('/user/:username', function(req, res) {
res.send('user: ' + req.params.username);
});
しかし、この2つの同じ規則に一致する経路にアクセスすると、要求はいつも前のルート規則によって捕捉され、後のルールは無視されることが分かります.理由は、Expressは、ルーティングルールを処理する際に、先に定義されたルーティングルールに優先的に合致するため、後の同じルールが遮断されるからです.Expressは、経路制御権の移転の方法、すなわちコールバック関数の第3パラメータnextを提供し、next()を呼び出すことにより、ルーティング制御権を後のルールに転送します.例えば、
app.all('/user/:username', function(req, res, next) {
console.log('all methods captured');
next();
});
app.get('/user/:username', function(req, res) {
res.send('user: ' + req.params.username);
});
マッチングされたパスにアクセスすると、http://localhost:3000/user/fangchao端末にはall methods capturedが印刷されており、ブラウザにはuser:fangchaoが表示されています.この説明要求はまず第一のルート規則によって捕獲され、consolie.logはnext()を使用して制御権を転送し、また第二のルールによって捕獲され、ブラウザに情報を返した.これは非常に有用なツールであり、中間部品を簡単に実現することができ、さらにコードの多重度を高めることができる.例えば、ユーザーに対して情報を検索したり、情報を修正したりする操作は、それぞれGETとPUTの操作に対応していますが、両方が共有するステップはユーザー名が合法かどうかを確認するので、next()の方法で実現できます.
var users = {
'fangchao': {
name: 'fangchao',
website: 'http://www.fangchao.com'
}
};
app.all('/user/:username', function(req, res, next) {
//         
if (users[req.params.username]) {
next();
} else {
next(new Error(req.params.username + ' does not exist.'));
}
});
app.get('/user/:username', function(req, res) {
//       ,    
res.send(JSON.stringify(users[req.params.username]));
});
app.put('/user/:username', function(req, res) {
//       
res.send('Done');
});
上記の例では、ap.allで定義されたこのルーティングルールは、実際には中間部品として機能し、同様の要求の同じ部分を抽出し、コードの維持に役立つ他のnext方法がパラメータを受け入れたら、つまり、エラーが発生したことを表します.この方法を使ってエラーをセグメント化し,コード結合度を低減することができる.