2016-11-16 3 views
0

私はdb内の新しいユーザーを作成するためのロジックを扱うミドルウェアを使用しています。この関数は、ユーザーの電子メールがすでに存在するかどうかをチェックし、そうでない場合は新しい文書を作成します。そうでない場合は、クライアントにエラーが送信されます。ExpressJSチェーンはnext()関数を複数回呼び出すことを約束します

(下)この機能で問題が

私は、ちょうどないチェーンこれら二つの約束を使用しない可能性があり、ユーザーの電子メールが既にDBに存在する場合、次の()ミドルウェア機能が2回呼び出されていることです誰かがこの種のエラー処理を解決する良いパターンを持っていれば、おそらく私のコードが間違っているか、私は約束を忘れていました。

create: function(req, res, next) { 

    // Check if email already exist 
    userDB.byEmail(req.body.email).then(function(doc) { 

     if (doc) { 
      res.setError('This email already exists', 409); 
      return next(); 
     } 

     // Return other Promise 
     return userDB.create(req.body); 

    }).then(function(doc) { 

     res.setResponse(doc, 200); 
     return next(); 

    }).catch(function(err) { 

     res.setError('Service seems to be unavailables', 503); 
     return next(); 
    }); 
}, 

注:私はちょうど私が要求状態を管理するのに役立つ個人的な方法のres.setError()またはres.setResponse() を使用していますし、私は 次のミドルウェア機能をres.sendを使用します

みんなありがとう3

答えて

0

あなたが約束チェーンを継続している.byEmailコールバックでreturn next()を行う<ので、次のもまた呼び出されてしまいます。約束のチェーンをthrowで壊すか、応答を1つの場所に設定する必要があります。

if (doc) { 
    const error = new Error('This email already exists'); 
    error.status = 409; 

    throw error; 
} 
// ... 
.catch(err => { 
    res.setError(err.message, err.status); 
    return next(); // you may not even want to do this in the case of errors 
}); 
+0

ご回答ありがとうございました。 - これは、約束どおりにエラーを投げる良いパターンですか? 私は約束を新しくしました。コールバックはtry/catchを使用できないため、nodeJS関数(err、res) 'パターンを使用しました。したがって、throw Error –

関連する問題