2016-08-26 14 views
10

マイAPI /auth/loginエンドポイントは、このようなreq.body取り存在しない場合に約束:。。。エンドポイントでFirebase .orderByChild()equalTo()()を1回、その後()は、子供が

{ 
    "email": "[email protected]", 
    "password": "supersecretpassword" 
} 

を、私が作ります私のFirebaseデータベース(https://jacob.firebaseio.com/users)への参照。私はデータを検索し、req.body.emailと一致するメールを持つ1人のユーザーを見つけたら、データベースに保存されているパスワードとパスワードを比較します。

私はin this Firebase blog postの輪郭を描いた約束の構造に従った。

router.post('/login', function(req, res) { 
    const ref = db.ref('/users'); 

    ref.orderByChild('email') 
    .equalTo(req.body.email) 
    .once('child_added') 
    .then(function (snapshot) { 
     return snapshot.val(); 
    }) 
    .then(function (usr) { 

     // Do my thing, throw any errors that come up 

    }) 
    .catch(function (err) { 

     // Handle my errors with grace 

     return; 
    }); 
}); 

子がrefで見つからない場合、関数は(this answerを参照)進みません。私は投げられたエラーを得ることさえしない。

私の目標は、特定のメールでユーザーが見つからない場合(すなわち、.equalTo(req.body.email)を満たすrefの子は見つからない)、ユーザーが見つかった場合はコードを実行しないときにコードを実行することです。何も見つからない場合、エラーはスローされません。

コードを実行した後にエンドポイントから完全に切り離そうとする目的で、文をデータベースへのコールの戦略的ポイント(.then()の約束事の終わり)に追加しようとしました。

.then(function (usr) { 

     // Do my thing, throw any errors that come up 

    }) 
    .catch(function (err) { 

     // Handle my errors with grace 

     return; 
    }); 

    res.status(401) 
    .json({ 
     error: 'No user found', 
    )}; 

    return; 
}); 

このコードは、呼び出しが非同期であるため、データベースの呼び出しが成功したかどうかに関係なく実行されます。

何も返されない場合、データベースへのこの呼び出しにどのように反応しますかはまだFirebase約束を使用していますか?

答えて

14

child_addedイベントは、クエリが少なくともusersのキーの1つと一致する場合にのみ起動し、複数の一致がある場合は複数回発生します。

router.post('/login', function(req, res) { 
    const ref = db.ref('/users'); 

    ref.orderByChild('email') 
    .equalTo(req.body.email) 
    .once('value') 
    .then(function (snapshot) { 
     var value = snapshot.val(); 
     if (value) { 
     // value is an object containing one or more of the users that matched your email query 
     // choose a user and do something with it 
     } else { 
     res.status(401) 
      .json({ 
      error: 'No user found', 
     )}; 
     } 
    }); 
}); 

:それは一度だけ発動すると、一致がない場合は、そのスナップショットは、一致したかnullvalueを持つことになりますusers下のすべてのキーが含まれています -

あなたが代わりにvalueイベントを使用することができますエラーを処理するには、約束を守り、このようなエラー処理を表現することができます:

router.post('/login', function(req, res, next) { 
    const ref = db.ref('/users'); 

    ref.orderByChild('email') 
    .equalTo(req.body.email) 
    .once('value') 
    .then(function (snapshot) { 
     ... 
    }) 
    .catch(next); 
}); 
関連する問題