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à vẫn sử dụng lời hứa Firebase?