当使用node.js的集合中存在值时,Firebase返回假值

时间:2019-04-22 09:49:39

标签: javascript node.js firebase-realtime-database

我正在尝试验证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);
});

1 个答案:

答案 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);
})

请注意,userExiststhen()回调中的内部也只有正确的值


如果您使用的是现代JavaScript环境,则可以使用async / await进行函数调用:

let userExists = await checkUserExist(req.body.reg_email);
console.log(userExists);

请注意,这仍在幕后进行异步调用。

对于刚接触异步API的开发人员来说,这是一个非常常见的问题。我强烈建议您查看以下一些先前的答案: