Javascript 承诺结果的运行逻辑
我有一个discord机器人,它想在数据库中存储带有城市名称的discord用户名。用户将键入命令!storeme[city name]和bot将在集合中创建一个新文档。例如,id为123456789的用户键入命令!storeme伦敦: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,以确保它尚未与城市关联。这就是
{
"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);
});
}