シナリオ:以下がノードWebアプリのコードの一部であることを考慮してください。
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
問題:next()
とreturn next()
のどちらを使用するかを確認しています。上記のサンプルコードは両方でまったく同じように機能し、実行に違いはありませんでした。
質問:誰かがnext()
を使用する場合とreturn next()
を使用する場合、そしていくつかの重要な違いについて、これに光を当てることができますか?
コールバックをトリガーした後に実行が停止することを保証するために、常にreturn next()
と書く人もいます。
そうしないと、2回目にコールバックをトリガーする危険性があり、通常は壊滅的な結果になります。コードはそのままで問題ありませんが、次のように書き直します。
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if(!id)
return next();
// do something
});
インデントレベルが節約され、後でコードをもう一度読むと、next
が2回呼び出されることはないはずです。
@Laurent Perrinの答えとして:
そうしないと、2回目にコールバックをトリガーする危険性があります。通常は壊滅的な結果になります。
このようなミドルウェアを作成する場合の例をここに示します。
app.use((req, res, next) => {
console.log('This is a middleware')
next()
console.log('This is first-half middleware')
})
app.use((req, res, next) => {
console.log('This is second middleware')
next()
})
app.use((req, res, next) => {
console.log('This is third middleware')
next()
})
コンソールの出力は次のとおりです。
This is a middleware
This is second middleware
This is third middleware
This is first-half middleware
つまり、すべてのミドルウェア機能が終了した後、next()の下のコードを実行します。
ただし、return next()
を使用すると、すぐにコールバックが飛び出し、コールバック内のreturn next()
以下のコードに到達できなくなります。
next()
は connectミドルウェア の一部です。ルーターフローのコールバックは、関数から何かを返すかどうかは関係ないので、return next()
とnext(); return;
は基本的に同じです。
関数の流れを止めたい場合は、次のようにnext(err)
を使用できます
app.get('/user/:id?',
function(req, res, next) {
console.log('function one');
if ( !req.params.id )
next('No ID'); // This will return error
else
next(); // This will continue to function 2
},
function(req, res) {
console.log('function two');
}
);
next()
は、リクエストのミドルウェアを拡張するために使用されます。
次() :
この関数を呼び出すと、アプリ内の次のミドルウェア関数が呼び出されます。 next()関数はNode.jsまたはExpress APIの一部ではありませんが、ミドルウェア関数に渡される3番目の引数です。