Javascript Firebase.orderByChild().equalTo().once().then()承诺当child不';不存在
我的APIJavascript Firebase.orderByChild().equalTo().once().then()承诺当child不';不存在,javascript,node.js,firebase,promise,firebase-realtime-database,Javascript,Node.js,Firebase,Promise,Firebase Realtime Database,我的API/auth/login端点采用如下的req.body: { "email": "jacob@gmail.com", "password": "supersecretpassword" } router.post('/login', function(req, res, next) { const ref = db.ref('/users'); ref.orderByChild('email') .equalTo(req.body.email) .on
/auth/login
端点采用如下的req.body
:
{
"email": "jacob@gmail.com",
"password": "supersecretpassword"
}
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);
});
在端点,我引用了我的Firebase数据库(https://jacob.firebaseio.com/users
)。我搜索数据,当我发现一个用户的电子邮件与req.body.email
匹配时,我将密码与数据库中存储的密码进行比较
我遵循概述的承诺结构
如果在ref
处未找到任何子项,则该功能不会继续(请参阅)。我甚至没有被抛出一个错误
我的目标是在找不到使用特定电子邮件的用户时运行代码(即在ref
中找不到满足.equalTo(req.body.email)
要求的子项),但如果找到用户,则不运行代码。未找到任何内容时不会引发错误
我尝试在数据库调用的关键点添加return
语句(在我的.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 promises,我如何对该调用作出反应?仅当查询与
用户
下的至少一个键匹配时,添加的子项事件才会激发,如果存在多个匹配项,则会多次激发
您可以改为使用值
事件-它只会触发一次,其快照将包含用户
下匹配的所有键,或者如果没有匹配项,则值
为空
:
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',
)};
}
});
});
关于错误处理,您可以按照以下方式连接承诺并表达错误处理:
{
"email": "jacob@gmail.com",
"password": "supersecretpassword"
}
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);
});