提问者:小点点

返回具有异步请求的布尔值[重复]


我真的需要帮助,我花了很多时间试图理解,但我不明白。 我使用的是nodeJS和MongoDB

我想做一个函数,根据电子邮件是否在数据库中返回true或false:

我已经做到了

function isUserRegistered(email) {
    MongoClient.connect(url, function (err, db) {
        if (err) throw err;
        let database = db.db(dataBaseName);
        let query = { "email": email };

        var userCollection = database.collection(collectionName)
        userCollection.find(query).toArray(function (err, result) {
            if (err) throw err;
            db.close();
            if (result.length > 0) {
                return true;
            } else {
                return false;
            }
        });
    });
}

console.log(isUserRegistered("jack@gmail.com").toString());

但是当我测试时,它不能工作,因为在我尝试打印它时,isUserRegistered()是未定义的。 我曾经尝试过做回调函数,我实现了打印“false”或“true”,但是对于回调函数,我只是启动了一个新函数,并且isUserRegister()不返回布尔值,所以我不能在以后的程序中做类似的事情:

if (isUserRegister(email){
      // Try to login
} else {
     // try to create the account
}

我也在寻找异步并等待,但我不知道应该在哪里使用它。 能用简单的方法固定吗?

谢谢


共1个答案

匿名用户

问题是您不能直接从回调中返回值(更多信息请参见此)。

由于NodeJS MongoClient支持开箱即用的承诺,因此可以非常容易地用async/await重写和简化代码。 注意,这仍然需要错误处理,但它应该给您一个开始:

async function isUserRegistered(email) {
    const client = await MongoClient.connect(url);

    const db = client.db(dataBaseName);

    const query = {
        "email": email
    };

    const result = await db.collection(collectionName).find(query).toArray();

    if (result.length > 0) {
        return true;
    } else {
        return false;
    }
}

(async () => {
    console.log(await isUserRegistered("jack@gmail.com"));
})();  

相关问题