#javascript #node.js #database #mongodb #mongoose
#javascript #node.js #База данных #mongodb — монгодб #mongoose #mongodb
Вопрос:
Итак, я создаю бота для discord, но у меня возникли некоторые проблемы с Mongoose. Итак, что я хочу, так это, по сути, пользователь отправляет сообщение, чтобы сохранить документ с некоторой его информацией, но если Документ с его информацией уже есть, он остановит процесс с возвратом. Итак, я попробовал это:
function main(message){
// So first user sends a message to store some data about him
let author = message.author //this is discord.js syntax, basically it returns the author of a message
let id = author.id //also discord.js syntax, returns the id from the user, in this case the author variable above
let check = logUser.findOne({userId : [id]}).exec().then(res => {
if (res) return true;
else return false;
})} // So if there is a Document with the id of the author of the message it will return true, else it returns false
if (check === true) return console.log("This User has already a Document with his info saved");
//so if the user has already a Document with his info it will return and stop the action of saving his Data
//everything from this point is basic Mongoose Syntax, to make a Document with User data
const theUser = new logUser({
_id : mongoose.Types.ObjectId(),
userName : author.username,
userId : author.id,
currency : 0
})
theUser.save()
.then(result => console.log(result))
.catch(err => console.log(err))
console.log(`User ${author.username} was stored into the database!`)
}
Сбой в операторе if, который проверяет, есть ли у пользователя документ с его информацией. Я пробовал много чего, но это не работает.
Я думаю, что решение этой проблемы связано с асинхронными функциями, но я не уверен, и я не так много знаю об асинхронных процессах.
Заранее спасибо!
Ответ №1:
Проблема в том, что вы обрабатываете LogUser.findOne как синхронный. Выполните проверку в обратном вызове findOne следующим образом:
function main(message){
// So first user sends a message to store some data about him
let author = message.author //this is discord.js syntax, basically it returns the author of a message
let id = author.id //also discord.js syntax, returns the id from the user, in this case the author variable above
logUser.findOne({userId : [id]}).exec().then(res => {
let check = Boolean(res);
if (check === true)
return console.log("This User has already a Document with his info saved");
const theUser = new logUser({
_id : mongoose.Types.ObjectId(),
userName : author.username,
userId : author.id,
currency : 0
});
theUser.save()
.then(result => {
console.log(result);
console.log(`User ${author.username} was stored into the database!`)
})
.catch(err => console.log(err))
});
}
Вы намеренно обертываете идентификатор в массив? Я не знаю вашей схемы, но это кажется странным и может способствовать вашим проблемам. userId : [id]
Возможно, вы захотите рассмотреть async / await для уменьшения обратных вызовов. Вы также можете рассмотреть возможность использования уникального индекса, чтобы избежать многократных запросов в будущем. Использование уникального индекса приведет к ошибке при попытке сохранить один и тот же документ дважды.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
https://docs.mongodb.com/manual/core/index-unique/
Комментарии:
1. Что касается переноса идентификатора, на самом деле это работает только так, если я не оберну его, он не распознает переменную.