2016-11-08 4 views
0

私は、ESLintが提供するconsistent-returnルールにいくつか問題があります。以下のコードでは、User.findOneコールバック関数の警告がconsistent-returnに送信されます。私が知る限り、findErrがなく、existingUserがある場合にのみ、.removeアクションを実行できます。ESLint一貫性のあるリターンとネストされたコールバック

これらのネストされたコールバックを回避するためのベストプラクティスは何ですか?私はconsistent-return警告を渡したいと思いますが、実際には解決策をオンラインで見たことはありません。これらのネストされたコールバックを回避するためのベストプラクティスでしょう何

function remove(req, res) { 
    User.findOne({ username: req.params.username }, (findErr, existingUser) => { 
    if (findErr) return res.status(500).send(errorHandler.getErrorMessage(findErr)); 
    if (!existingUser) return res.status(404).send({ message: 'User not found' }); 

    existingUser.remove((removeErr) => { 
     if (removeErr) return res.status(500).send(errorHandler.getErrorMessage(removeErr)); 

     return res.json({ message: `${existingUser.username} successfully deleted` }); 
    }); 
    }); 
} 
+0

'remove'を呼び出すと' undefined'が返されます。 – Paulpro

答えて

1

約束

私は、あなたが最良の早期リターンを使用しないと思います

警告一貫したリターンを渡したいと思います。代わりに、別の方法として

function remove(req, res) { 
    User.findOne({ username: req.params.username }, (findErr, existingUser) => { 
    if (findErr) res.status(500).send(errorHandler.getErrorMessage(findErr)); 
    else if (!existingUser) res.status(404).send({ message: 'User not found' }); 

    else existingUser.remove((removeErr) => { 
     if (removeErr) res.status(500).send(errorHandler.getErrorMessage(removeErr)); 

     else res.json({ message: `${existingUser.username} successfully deleted` }); 
    }); 
    }); 
} 

を書き、あなたはまた、{ "treatUndefinedAsUnspecified": true }オプションを有効にしてreturn void …を使用することができます

function remove(req, res) { 
    User.findOne({ username: req.params.username }, (findErr, existingUser) => { 
    if (findErr) { 
     res.status(500).send(errorHandler.getErrorMessage(findErr)); 
     return; 
    } 
    if (!existingUser) { 
     res.status(404).send({ message: 'User not found' }); 
     return; 
    } 
    existingUser.remove((removeErr) => { 
     if (removeErr) { 
     res.status(500).send(errorHandler.getErrorMessage(removeErr)); 
     return; 
     } 
     res.json({ message: `${existingUser.username} successfully deleted` }); 
    }); 
    }); 
} 

行うことができる必要があります。

+0

私は理解するかどうか見てみましょう。あなたが言っていることは、私の現在のコードにおける "矛盾する"リターンステートメントは 'res res.status(404)...'であり、 'res.status(500)...'等々。あなたの答えでは、 'User.findOne'の終わりに明示的な' return'がなくても、ブロック全体のすべての 'return'は同じです....簡単な' return; '。私の理解は正しいのですか?この答えをベストプラクティスのフレンドリーな「プロミス」に変換することをさらに拡大できますか?私は試みましたが、良い解決策を管理しませんでした。 – germainelol

+0

'if'ブロックで' res res。... '(結果値のように見えます)の不一致がありますが、elseの場合*何も返さない*。すべての関数(およびすべてのコールバック)が別々に扱われることに注意してください。約束事への変換に関して、それは[余分な質問](http://stackoverflow.com/questions/ask)でよりよく答えられます。 – Bergi

+0

私はあなたの最初の解決策ではどこにも 'return'sがないことを理解していますので、' if'/'else'文を実行する単純な関数です。しかし、2番目の解決策では、 'if'ブロックに何かを返すのはまだそれではないでしょうか?' else'状況では何も返さないのですか? 'else'の場合、' .remove'を実行していて、 'User.findOne'のために何も返さないのですか? – germainelol

関連する問題