#node.js #discord.js
Вопрос:
Я отлаживаю логику проверки разрешений. То, что я хочу сделать, — это изящно обрабатывать случаи, когда я делаю это и не имею на это разрешения. Вот мой код:
console.log(`permissions for me: ${JSON.stringify(guild.systemChannel.permissionsFor(guild.me).has('SEND_MESSAGES'))}`)
//joined a server
try{
//Check for system channel
if ( undefined == guild.systemChannel) {
console.error(`${error}: guild.systemChannel does not exist during guildCreate callback`)
}
else if( ( guild.systemChannel) amp;amp; ( !guild.systemChannel.permissionsFor(guild.me).has('SEND_MESSAGES') ) ) {
console.error(`${error}: guild.systemChannel permissions to write are not available, during guildCreate callback`)
}
else {
//Sends message to system channel
guild.systemChannel.send('Thank you for adding me to your server!')
...
В сообщении журнала указывается «true», когда я подключаюсь к серверу. Оказывается, этот сервер имеет пользовательские переопределения привилегий для системного канала и не разрешает разрешение @everyone отправлять сообщения. Однако бот запросил разрешения на отправку сообщений в рамках своей роли, и поэтому в сообщении журнала консоли указано значение true.
guild.systemChannel.send('Thank...)
сообщение завершается ошибкой, при этом Discord выдает ошибку с сообщением об ошибке разрешений:
/home/path/node_modules/discord.js/src/rest/RequestHandler.js:154
throw new DiscordAPIError(request.path, data, request.method, res.status);
^
DiscordAPIError: Missing Access
at RequestHandler.execute (/home/path/node_modules/discord.js/src/rest/RequestHandler.js:154:13)
at runMicrotasks (<anonymous>)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
...
Поэтому, если я изменю разрешения сервера на системном канале и сделаю его @каждый может отправлять сообщения, код works….it отправляет приветственное сообщение.
поэтому у меня есть проблема с моей логикой проверки ошибок над ней. Я думаю, что роли и разрешения бота находятся в конфликте…как правильно проверить?
Комментарии:
1. Разве вы не можете использовать простое
channel.send(…).catch(err => {…})
?2. @MrMythical, можете ли вы помочь мне понять, почему блок try/catch вокруг раздела не улавливает этого, но мне пришлось бы завернуть его непосредственно в это обещание?
3. Вы должны добавить
await
перед ним, чтобы он ждал разрешения или отклонения. Однако с этим гораздо проще.catch
4. ладно, понял, в этом есть смысл. да, и то и другое сработало. Если вы хотите отправить в качестве ответа, я поставлю соответствующую оценку! @MrMythical еще раз спасибо!
5. Я только что опубликовал ответ.
Ответ №1:
Вы должны await
выполнить обещание в блоке try/catch. Без этого функция try/catch не обнаружит его, так как для его устранения требуется время. Добавление await
заставит его ждать и обнаружит ошибку. Однако простое .catch()
гораздо проще.
Ответ №2:
Я публикую ответ от имени комментариев @MrMythical…ожидание или .улов были в порядке. Хотя я думаю, что именно из-за моего опыта работы на C концепция содержащегося блока try-catch, который не улавливает вещи, меня беспокоит. Я думаю, что это связано с синхронизацией/асинхронностью этого потока кода, выполнение может выйти из блока до того, как будет поймано исключение.