Проблемы с документами в Mongoose (JavaScript)

#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. Что касается переноса идентификатора, на самом деле это работает только так, если я не оберну его, он не распознает переменную.