【问题标题】:Running logic off of promise result从承诺结果运行逻辑
【发布时间】:2020-08-09 22:10:04
【问题描述】:

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

{
    "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 (checkUserIdInDatabase(user.userID)) 总是返回 false,即使用户存在于数据库中。如果我将逻辑放在 collection.findOne() 匿名函数中,那么它可以很容易地确定这一点。

然后我认为问题在于storeme 中的承诺checkUserIdInDatabase 尚未解决。

我的问题是如何让函数storeme 判断用户是否存在于数据库中?我可以将collection.findOne() 移动到storeme 并在匿名函数中运行所有逻辑,但这感觉很笨拙。

【问题讨论】:

    标签: javascript node.js mongodb discord


    【解决方案1】:

    我解决这个问题的方法是将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
    }
    

    【讨论】:

      【解决方案2】:

      查询数据库是一个异步任务。所以你应该使用Promise或者Async/await来处理输出。

      在这种情况下,你应该用这样的承诺重写你的checkUserIdInDatabase

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

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 2017-10-18
        • 1970-01-01
        • 2016-12-05
        • 2017-08-04
        • 2019-06-30
        相关资源
        最近更新 更多