Javascript 承诺结果的运行逻辑

Javascript 承诺结果的运行逻辑,javascript,node.js,mongodb,discord,Javascript,Node.js,Mongodb,Discord,我有一个discord机器人,它想在数据库中存储带有城市名称的discord用户名。用户将键入命令!storeme[city name]和bot将在集合中创建一个新文档。例如,id为123456789的用户键入命令!storeme伦敦: { "userid": 123456789, "cityname": "London" } 然后存储在集合中 但是,我只希望每个用户都有一个条目,这是无法更改的。因此,当用户键入命令时,会根据数据库检查其用户ID,以确保它尚未与城市关联。这就是

我有一个discord机器人,它想在数据库中存储带有城市名称的discord用户名。用户将键入命令!storeme[city name]和bot将在集合中创建一个新文档。例如,id为123456789的用户键入命令!storeme伦敦:

{
    "userid": 123456789,
    "cityname": "London"
}
然后存储在集合中

但是,我只希望每个用户都有一个条目,这是无法更改的。因此,当用户键入命令时,会根据数据库检查其用户ID,以确保它尚未与城市关联。这就是我的问题所在


function checkUserIdInDatabase(userID){
    const collection = db.collection("UserToCity")
    var result = collection.findOne({"userid": userID}, function(err, db){
        return !!result  // True if the user already exists in the database
    })
}

function storeme(user, cityname){
    // Do some data verification stuff here
    if (checkUserIdInDatabase(user.userID)){
       console.log("User already in the database!")
    } else {
       addUserToDatabase(user, cityname)  // This function is known to work
    }
}
我的问题是,条件
if(checkuseridinabase(user.userID))
总是返回false,即使数据库中存在该用户。如果我将逻辑放在
collection.findOne()
anonymous函数中,那么它可以很容易地确定这一点

然后,我假设问题是在
storeme
中,
checkuseridinabase
中的承诺尚未得到解决


我的问题是如何允许函数
storeme
确定数据库中是否存在该用户?我可以将
collection.findOne()
移动到
storeme
中,并运行匿名函数中的所有逻辑,但这感觉非常笨拙。

我解决这个问题的方法是将
storeme
中的功能包装到自己的函数中,将代码更改为如下:

function checkUserIdInDatabase(userID){
    const collection = db.collection("UserToCity")
    var result = collection.findOne({"userid": userID}, function(err, db){
        return !!result  // True if the user already exists in the database
    })
}

function addUserToDatabase(user, cityname){
    const collection = db.collection("UserToCity")

    var result = collection.findOne({"userid": userID}, function(err, db){
        if (checkUserIdInDatabase(user.userID)){
           console.log("User already in the database!")
        } else {
           collection.add(user, cityname)
        }
    })

}

function storeme(user, cityname){
    // Do some data verification stuff here
    addUserToDatabase(user, cityname)
    // Any other stuff can be done here
}

查询数据库是一项异步任务。因此,您应该使用或来处理输出

在这种情况下,您应该像这样重写您的
checkuseridinabase

function checkUserIdInDatabase(userID) {
  return new Promise((resolve, reject) => {
    const collection = db.collection("UserToCity")
    collection.findOne({ "userid": userID }, function (err, result) {
      if (err) {
        reject(err);
        db.close();
      }
      else {
        resolve(!!result);  // True if the user already exists in the database
        db.close();
      }
    });
  });
}
并在
storeme
函数中调用它

function storeme(user, cityname) {
  // Do some data verification stuff here
  checkUserIdInDatabase(user.userID)
    .then(res => {
      if (res) {
        console.log("User already in the database!")
      }
      else {
        addUserToDatabase(user, cityname)  // This function is known to work
      }
    })
    .catch(err => {
      // handle error
      console.log(err);
    });
}