2016-08-26 18 views
10

My API /auth/login endpoint mất một req.body như thế này:căn cứ hỏa lực .orderByChild() equalTo() một lần() sau đó() Promises khi con không tồn tại

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

Tại điểm cuối, tôi làm tham chiếu đến cơ sở dữ liệu Firebase của tôi (https://jacob.firebaseio.com/users). Tôi tìm kiếm thông qua dữ liệu và khi tôi tìm thấy một người dùng có email khớp với req.body.email, tôi so sánh mật khẩu với mật khẩu được lưu trữ trong cơ sở dữ liệu.

Tôi đã theo cấu trúc lời hứa được nêu 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; 
    }); 
}); 

Nếu không có con được tìm thấy ở ref, chức năng không tiến hành (xem this answer). Tôi thậm chí không nhận được một lỗi ném.

Mục tiêu của tôi là chạy mã khi không tìm thấy người dùng với một email nhất định (nghĩa là không có trẻ em nào được tìm thấy ở số ref thỏa mãn .equalTo(req.body.email)), nhưng không chạy mã nếu người dùng được tìm thấy. Không có lỗi được ném khi không tìm thấy gì.

Tôi đã thử thêm return phát biểu tại các điểm chiến lược trong cuộc gọi đến cơ sở dữ liệu (ở cuối số .then() lời hứa) với ý định đột nhập hoàn toàn điểm cuối sau khi mã được chạy. Sau đó tôi đặt mã sau khi gọi đến cơ sở dữ liệu:

.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; 
}); 

nhưng mã này chạy cho dù cuộc gọi đến cơ sở dữ liệu thành công hay không, vì cuộc gọi không đồng bộ.

Làm cách nào để phản hồi lời gọi này đến cơ sở dữ liệu nếu nó không trả lại bất kỳ điều gì vẫn sử dụng lời hứa Firebase?

Trả lời

14

Sự kiện child_added chỉ kích hoạt nếu truy vấn phù hợp với ít nhất một trong các phím dưới users và sẽ kích hoạt nhiều lần nếu có nhiều kết quả phù hợp.

Bạn có thể sử dụng các sự kiện value thay - nó sẽ cháy một lần duy nhất và ảnh chụp của nó sẽ chứa tất cả các phím dưới users rằng phù hợp hoặc sẽ có value của null nếu không có trận đấu:

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', 
     )}; 
     } 
    }); 
}); 

Về xử lý lỗi, bạn có thể xử lý lời hứa và xử lý lỗi nhanh như sau:

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); 
}); 
Các vấn đề liên quan