Discord.js开发:如何设置频道权限禁@everyone查看仅允许工单发起者访问
问题修复方案
错误点说明
- 变量引用错误:获取@everyone角色时使用了未定义的
msg对象,上下文仅存在message对象,直接触发引用报错 - 权限配置语法错误:
permissionOverwrites数组要求每个权限主体对应一个独立对象,你将@everyone和用户的权限写在同一个对象内,后面的id会覆盖前值,导致@everyone的权限规则完全失效 - 语法结构不完整:当前代码片段存在多处大括号、括号未闭合问题,运行直接报语法错误
- 异步上下文缺失:
guild.channels.create使用了await,但外层函数未声明为async,会触发语法错误 - 版本适配提示:若使用Discord.js v14及以上版本,创建文本频道需额外指定频道类型参数,否则创建失败
修复后代码示例
// 注意:当前代码所在的外层函数必须添加async关键字,否则await会报错 async function yourFunctionName(message) { if (message.channel.type !== "text") { let active = db.fetch(`support_${message.author.id}`) let guild = client.guilds.cache.get('替换为你的服务器ID') let channel, found = true try { if (active) client.channels.cache.get(active.channelID).guild } catch (e) { found = false; } if(!active || !found) { active = {} // 修复变量名错误,将msg改为message let everyoneRole = message.guild.roles.cache.find(r => r.name === '@everyone'); channel = await guild.channels.create(`${message.author.username}-${message.author.discriminator}`, { // 若为Discord.js v14+ 请取消下面这行注释,同时导入ChannelType // type: ChannelType.GuildText, parent: '替换为你的分类ID', topic: `Support for ${message.author.tag} | ID: ${message.author.id}`, // 修复权限配置错误,拆分为两个独立的权限对象 permissionOverwrites: [ { id: everyoneRole.id, deny: ['VIEW_CHANNEL'], }, { id: message.author.id, allow: ['VIEW_CHANNEL'], } ], }) // 后续业务逻辑补充:将频道ID写入数据库留存 db.set(`support_${message.author.id}`, { channelID: channel.id }) } } }
内容的提问来源于stack exchange,提问作者Jason H - Wizard
相关产品推荐
相关产品推荐

