You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

制作Discord工单机器人报错:message.guild.createChannel不是函数

解决 message.guild.createChannel is not a function 报错

嘿,这个报错我太熟悉了——你用的是Discord.js旧版本的API写法,而现在Discord.js已经更新到v12+,很多核心方法都做了重构,旧写法自然会失效。下面是一步步的修复方案:

核心API变更点

  • message.guild.createChannel() → 替换为 message.guild.channels.create()(v12+把频道管理功能移到了channels属性下)
  • 角色、频道这类集合必须通过.cache访问(比如roles.find()要改成roles.cache.find())
  • RichEmbed 类被重命名为 MessageEmbed(v12+的新命名规范)
  • 权限建议用官方枚举值Discord.Permissions.FLAGS.*,避免字符串拼写出错

修复后的完整代码

// 确保你已正确导入Discord.js,示例:
// const Discord = require('discord.js');
// const client = new Discord.Client();

if (message.content.toLowerCase().startsWith(prefix + `openticket`)) { 
  const reason = message.content.split(" ").slice(1).join(" "); 
  // 检查频道是否存在:改用cache.find并匹配频道名称
  if (message.guild.channels.cache.find(c => c.name === `ticket-${message.author.id}`)) {
    return message.channel.send(`You already opened a ticket.`); 
  }
  // 替换createChannel为channels.create,指定频道类型为GUILD_TEXT
  message.guild.channels.create(`ticket-${message.author.id}`, {
    type: 'GUILD_TEXT'
  }).then(c => { 
    // 注意:原代码里的role变量未定义,这里假设你有一个名为"Support Team"的客服角色
    const supportRole = message.guild.roles.cache.find(r => r.name === "Support Team");
    // 获取@everyone角色:改用cache.find
    const everyoneRole = message.guild.roles.cache.find(r => r.name === "@everyone");
    
    // 权限设置:使用Permissions.FLAGS枚举值,且v12+用VIEW_CHANNEL替代旧的READ_MESSAGES
    if (supportRole) {
      c.permissionOverwrites.create(supportRole, {
        SEND_MESSAGES: true,
        VIEW_CHANNEL: true
      });
    }
    c.permissionOverwrites.create(everyoneRole, {
      SEND_MESSAGES: false,
      VIEW_CHANNEL: false
    });
    c.permissionOverwrites.create(message.author, {
      SEND_MESSAGES: true,
      VIEW_CHANNEL: true
    });

    message.channel.send(`:white_check_mark: Your ticket is opened, #${c.name}.`); 
    // 替换RichEmbed为MessageEmbed
    const embed = new Discord.MessageEmbed() 
      .setColor(0xCF40FA) 
      .addField(`Hey ${message.author.username}!`, `Your Ticket is opened.${reason ? `\nReason: ${reason}` : ''}`) // 可选:加上用户提交的工单原因
      .setTimestamp(); 
    // v13+用embeds数组,v12用embed: embed,这里兼容两种写法
    c.send({ embeds: [embed] || { embed: embed } }); 
    message.delete().catch(err => console.log("Failed to delete message:", err)); 
  }).catch(console.error); 
}

额外注意事项

  • 版本检查:确保你安装的是最新版Discord.js,执行命令:
    npm install discord.js@latest
    
  • 未定义的role变量:原代码里的role没有定义,我在修复代码里假设了一个supportRole,你需要替换成自己服务器里的客服角色名称或ID。
  • 权限名称变更:v12+中READ_MESSAGES被重命名为VIEW_CHANNEL,一定要替换,否则权限设置不会生效。

这样修改后,你的工单机器人应该就能正常创建频道了!

内容的提问来源于stack exchange,提问作者Slameko552

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:12:47