我正在尝试验证Firebase中的记录,然后再使用node.js向发布请求中的用户注册
***** Node.js代码****
function checkUserExist(email) {
var userExist = false;
userRef.orderByChild('email').equalTo(email).once('value').then(function (snapshot) {
if (snapshot.exists()) {
userExist = true;
console.log(userExist); // Here the value is returned true
}
});
return userExist;
}
app.post('/register', urlencodedParser, function (req, res) {
var testUser = checkUserExist(req.body.reg_email);
console.log('A: '+ testUser);
// Here the value is returned false instead of true
console.log(checkUserExist(req.body.reg_email), req.body.reg_email);
// Here the value is returned false instead of true
var newUserObj = {
first_name: req.body.reg_first_name,
last_name: req.body.reg_last_name,
email: req.body.reg_email
};
userRef.push(newUserObj);
res.render('pages/register', { reg_data: { post_data: req.body, is_success: created, is_user_exist: checkUserExist(req.body.reg_email) } });
//console.log(users);
});
答案 0 :(得分:0)
从Firebase异步加载数据。到您的return userExist
运行时,数据尚未加载。
使用一些日志记录语句最容易看到这一点:
console.log('Before starting query');
userRef.orderByChild('email').equalTo(email).once('value').then(function (snapshot) {
console.log('Got query results');
});
console.log('After starting query');
运行此代码时,将得到以下输出:
开始查询之前
开始查询后
获得查询结果
这可能不是您期望的顺序,但是它恰好解释了为什么您的方法返回错误值的原因:函数返回时尚未加载数据。
任何需要数据库中数据的代码,都必须在then()
回调内部,或者从那里调用。
处理异步API的常用方法是返回承诺:
function checkUserExist(email) {
var userExist = false;
return userRef.orderByChild('email').equalTo(email).once('value').then(function (snapshot) {
return snapshot.exists();
});
}
现在您可以像这样呼叫checkUserExist
:
checkUserExist(req.body.reg_email).then(function(userExists) {;
console.log(userExists);
})
请注意,userExists
在then()
回调中的内部也只有正确的值 。
如果您使用的是现代JavaScript环境,则可以使用async
/ await
进行函数调用:
let userExists = await checkUserExist(req.body.reg_email);
console.log(userExists);
请注意,这仍在幕后进行异步调用。
对于刚接触异步API的开发人员来说,这是一个非常常见的问题。我强烈建议您查看以下一些先前的答案: