#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, и сравнил то, что было кэшировано, с тем, что было передано в сообщении.