discord.js开发工单机器人报错:channel.updateOverwrite is not a function
报错原因
你参考的教程基于discord.js v12版本编写,discord.js v13及以上版本已经移除channel.updateOverwrite方法,所以调用时会抛出方法不存在的错误。
修复方案
- 将代码中所有
channel.updateOverwrite调用替换为channel.permissionOverwrites.edit,传参规则完全一致无需调整 - 修复代码中
channel.setname的拼写错误,正确方法名为channel.setName - 修复权限校验方法的版本兼容问题,v13及以上版本
hasPermission已废弃,替换为permissions.has - 如果你使用的是discord.js v14版本,还需要将所有权限标识从大写蛇形(如
SEND_MESSAGE、VIEW_CHANNEL)改为大驼峰写法(SendMessages、ViewChannel),否则权限设置不会生效
修复后的完整代码
module.exports = { name: 'ticket', description: 'Open a ticket!', async execute(client, message, args, cmd, Discord) { // 创建工单频道 let channel = await message.guild.channels.create( `ticket: ${message.author.tag}`, // v14版本请替换为 { type: Discord.ChannelType.GuildText } { type: 'text' } ); await channel.setParent('912495738947260446'); // 更新频道权限 channel.permissionOverwrites.edit(message.guild.id, { // v14版本请替换为 SendMessages: false, ViewChannel: false SEND_MESSAGE: false, VIEW_CHANNEL: false }); channel.permissionOverwrites.edit(message.author, { // v14版本请替换为 SendMessages: true, ViewChannel: true SEND_MESSAGE: true, VIEW_CHANNEL: true }); const reactionMessage = await channel.send('感谢提交工单!工作人员会尽快与你联系,请在此说明提交工单的原因。'); try { await reactionMessage.react("🔒"); await reactionMessage.react("🗑️"); } catch(err) { channel.send('表情添加失败!请告知开发者查看控制台报错!'); throw err; } const collector = reactionMessage.createReactionCollector((reaction, user) => message.guild.members.cache.find((member) => member.id === user.id).permissions.has('ADMINISTRATOR'), {dispose: true}); collector.on('collect', (reaction, user) => { switch (reaction.emoji.name) { case "🔒": channel.permissionOverwrites.edit(message.author, { // v14版本请替换为 SendMessages: false, ViewChannel: false SEND_MESSAGE: false, VIEW_CHANNEL: false }); channel.setName(`🔒 ${channel.name}`) break; case "🗑️": channel.send('10秒后将删除该频道!'); setTimeout(() => channel.delete(), 10000); break; } }); } }
内容的提问来源于stack exchange,提问作者DevOffline
相关产品推荐
相关产品推荐

