web-dev-qa-db-ja.com

Node.jsでnext()を使用してnext()を返す場合

シナリオ:以下がノード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()を使用する場合、そしていくつかの重要な違いについて、これに光を当てることができますか?

107
Amol M Kulkarni

コールバックをトリガーした後に実行が停止することを保証するために、常にreturn next()と書く人もいます。

そうしないと、2回目にコールバックをトリガーする危険性があり、通常は壊滅的な結果になります。コードはそのままで問題ありませんが、次のように書き直します。

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;

    if(!id)
        return next();

    // do something
});

インデントレベルが節約され、後でコードをもう一度読むと、nextが2回呼び出されることはないはずです。

114
Laurent Perrin

@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()以下のコードに到達できなくなります。

126
PJCHENder

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()は、リクエストのミドルウェアを拡張するために使用されます。

42
drinchev

次() :

この関数を呼び出すと、アプリ内の次のミドルウェア関数が呼び出されます。 next()関数はNode.jsまたはExpress APIの一部ではありませんが、ミドルウェア関数に渡される3番目の引数です。

0
Manish sharma