discord.js工单系统如何不使用数据库检测用户是否已有已开工单
实现方案
你现有代码创建工单时已经将用户ID写入了频道topic字段,且所有工单都存放在指定父分类下,直接遍历该分类下的频道即可完成检测,无需接入数据库。
修改后的ticket分支代码
case 'ticket': case 'Ticket': // 先检测用户是否已有工单 const ticketCategory = message.guild.channels.cache.get('897771652451678268') // 匹配父分类下topic对应用户ID的工单频道 const userTicket = ticketCategory.children.cache.find(channel => channel.topic === `${message.author.id}-ticket`) if (userTicket) { return message.channel.send(`你已存在未关闭的工单:<#${userTicket.id}>,请勿重复提交`) } const guild = client.guilds.cache.get('897417868633940028') // 注意:channels.create是异步方法,需用await接收返回的频道对象,避免后续找不到频道 const newTicketChannel = await guild.channels.create(message.member.displayName + 's-ticket', { type: 'text', topic: message.author.id + '-ticket', parent: '897771652451678268', permissionOverwrites: [ { id: message.author.id, allow: ['SEND_MESSAGES', 'VIEW_CHANNEL', 'READ_MESSAGE_HISTORY', 'EMBED_LINKS', 'ATTACH_FILES'], }, { id: message.guild.roles.everyone, deny: ['VIEW_CHANNEL'], }, { id: "897772395368583178", allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'], }, ], }) const created = new Discord.MessageEmbed() .setTitle("Ticket-System") .setThumbnail('png') .setDescription(`你好,${message.member.displayName},你的工单已创建成功`) .setColor("GREY") .setTimestamp() message.channel.send({ embeds: [created] }); break;
注意事项
- 该方案依赖工单频道的topic不被随意修改,你现有的
rename指令仅修改频道名称,不会影响检测逻辑 - 如果出现机器人重启后缓存丢失导致漏检的情况,可以在检测前调用
await ticketCategory.children.fetch()拉取全量频道数据 - 单服务器工单量超过1000条后,遍历检测的性能会下降,后续可以考虑接入轻量JSON数据库比如
lowdb优化 - 若要使用上面代码里的
await语法,需要将你的指令处理函数改为async声明的异步函数
内容的提问来源于stack exchange,提问作者I need Help
相关产品推荐
相关产品推荐

