Discord.js Commando нужно иметь Haspermisison (), чтобы сделать его асинхронным или дождаться запроса базы данных

#javascript #node.js #mongodb #discord.js #commando

Вопрос:

Поэтому я работаю над ботом для раздора, используя discord.js и его структура коммандос.

Я храню некоторую информацию в базе данных mongodb, такую как префикс сервера или роли для выполнения определенных команд.

Структура commando имеет функцию, называемую

 hasPermission(message) {
   ...
}
 

При этом ожидается, что значение возвратит значение true или false, и если оно равно true, команда выполняется, если ложная команда не выполняется и выдает ошибку в разладе.

Ну, мне нужно проверить, что у пользователя есть определенная роль или роли для использования им определенной команды (модерация)

Вот код

 async hasPermission(message) {
   const perm = await roleList.find({Guild_id: message.guild.id})
   console.log(perm[0].Roles)
   return (message.member.roles.cache.some(role => perm[0].Roles.includes(role.name)))
}
 

Теперь, делая его асинхронным, он просто нарушает его функциональность и всегда будет возвращать значение true.

Поэтому я попытался использовать такие обещания, как

 hasPermission(message){
   roleList.find({Guild_id: message.guild.id}).then(roles => {
      console.log(roles[0].Roles)
      const b= (message.member.roles.cache.some(role => roles[0].Roles.includes(role.name)))
      console.log("Has permission?", b)
      return b
   })
}
 

Это вернуло значение true в .then (), но оно не прошло и вернуло значение false (которое является значением по умолчанию).

Вызов базы данных работает правильно, сравнение возвращает true, когда должно, и false, когда должно, просто функция hasPermission() не запускается.

Мне нужно проверить их роли из базы данных, прежде чем они смогут выполнить команду, и нет встроенной проверки «Роли», и мне не повезло с их сервером поддержки discord. Любые предложения.

Ответ №1:

Ты определенно был на правильном пути! Вместо того , чтобы просто использовать then , попробуйте вернуть обещание.

 hasPermission(message) {
  return new Promise((resolve, reject) => {
    roleList.find({
        Guild_id: message.guild.id
    }).then(perm => {
        console.log(perm[0].Roles);

        return resolve((message.member.roles.cache.some(role => perm[0].Roles.includes(role.name))));
    });
  });
};
 

Это вернет обещание, которое само собой разрешится при resolve вызове функции. Теперь вы можете просто await hasPermission вызвать функцию, когда вы ее вызываете, и она должна возвращать то, что вы хотите. Это также позволяет вам использовать .then() эту hasPermission функцию, если это необходимо.

Комментарии:

1. Поэтому, хотя в данном конкретном случае возврат обещания сработал для меня, проблема в том, что hasPermission ДОЛЖЕН выполняться синхронно. Вместо проверки базы данных в функции hasPermission я кэшировал результаты базы данных в клиентском объекте, к которому имеет доступ hasPermission, и сравнил то, что было кэшировано, с тем, что было передано в сообщении.