nodejs在发送消息之前检查systemchannel的权限



我正在调试一个权限检查逻辑。我想做的是优雅地处理我这样做和没有权限这样做的情况

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) && ( !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!')
...

日志消息指示";真";当我加入服务器时。事实证明,该服务器具有系统通道的自定义权限覆盖,并且不允许@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)
...

因此,如果我更改系统通道上的服务器权限,并将其设置为"每个人都可以发送消息",代码就会工作。。。。它发出欢迎信息。

所以我上面的错误检查逻辑有问题。我认为角色和机器人权限冲突。。。如何正确检查?

您必须awaittry/catch块中的promise。如果不这样做,try/catch就不会检测到它,因为它需要时间来解决。添加await将强制它等待并捕获错误。不过,简单的.catch()要容易得多。

我代表@MrMythical的评论发布答案。。。等待或接球都很好。虽然我认为这是因为我的基于C的背景,所以包含的try-catch块不能捕获东西的概念让我感到困扰。我认为这也是因为这个代码流的同步/异步性质,执行可以在捕获异常之前退出块。

最新更新