Discord机器人Noprefix命令TypeError错误排查求助
Discord机器人Noprefix命令报错排查与解决
错误日志
TypeError: Cannot read properties of undefined (reading 'get') at Object.run (/home/container/src/commands/Message/Utility/Noprefix.js:31:45) at module.exports.run (/home/container/src/events/botEvents/guild/messageCreate.js:66:17) at runMicrotasks (<anonymous>) at processTicksAndRejections (node:internal/process/task_queues:96:5)
相关代码
const { EmbedBuilder } = require("discord.js"); module.exports = { name: "Noprefix", description: "Add's No prefix.", category: "Utility", aliases: ["np"], owner: true, run: async(client, message, args) => { try{ let ok = ['950068359213506580','995212517523603456','1075469143324770325','783661052738011176','768061935371419688']; if(!ok.includes(message.author.id)) return; if(!args[0]) { return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:x: | Usage : \`${prefix}noprefix <add/remove/show> <user/user_id> <server/all>\``)]}) } let op = args[0].toLowerCase(); if(op === `add`) { let us = message.mentions.members.first() || message.guild.members.cache.get(args[1]); if(!us){ return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:x: | Please provide me a valid user`)]}) } let pk = args[2] if(pk === `all`) { let db = await client.data2.get(`noprefix_${client.user.id}`); if(!db || db === null) client.data.set(`noprefix_${client.user.id}`,[]) let um = []; db.forEach(x => um.push(x)); if(um.includes(us.id)) { return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:white_check_mark: | This user is already in my all server's no prefix`)]}) } else{ um.push(us.id); await client.data2.set(`noprefix_${client.user.id}`,um); return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:white_check_mark: | Added ${us} to my all server's no prefix`)]}) } } else{ let guild = await client.guilds.fetch(args[2]) if(!guild){ return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:x: | Please provide me a valid server`)]}) } let db2 = await client.data2.get(`noprefix_${guild.id}`); if(!db2 || db2 === null) client.data2.set(`noprefix_${guild.id}`,[]) let oo =[]; db2.forEach(x => oo.push(x)); if(oo.includes(message.author.id)) { return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:x: | This user is already in ${guild.name}'s no prefix`)]}) } else{ oo.push(us.id); await client.data2.set(`noprefix_${guild.id}`,oo); return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:white_check_mark: | Added ${us} to ${guild.name}'s no prefix`)]}) } } } if(op === `remove`) { let us = message.mentions.members.first() || message.guild.members.cache.get(args[1]); if(!us){ return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:x: | Please provide me a valid user`)]}) } let pk = args[2] if(pk === `all`) { let db = await client.data2.get(`noprefix_${client.user.id}`); if(!db || db === null) client.data.set(`noprefix_${client.user.id}`,[]) let um = []; db.forEach(x => um.push(x)); if(!um.includes(us.id)) { return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:white_check_mark: | This user is not present in my all server's no prefix`)]}) } else{ let bhai = um.filter(x => x !== us.id); await client.data2.set(`noprefix_${client.user.id}`,bhai); return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:white_check_mark: | Removed ${us} from my all server's no prefix`)]}) } } else{ let guild = await client.guilds.fetch(args[2]); if(!guild){ return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:x: | Please provide me a valid server`)]}) } let db2 = await client.data2.get(`noprefix_${guild.id}`); if(!db2 || db2 === null) client.data2.set(`noprefix_${guild.id}`,[]) let oo =[]; db2.forEach(x => oo.push(x)); if(!oo.includes(message.author.id)) { return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:white_check_mark: | This user is not present in ${guild.name}'s no prefix`)]}) } else{ let sh = oo.filter(x => x !== us.id); await client.data2.set(`noprefix_${guild.id}`,sh); return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:white_check_mark: | Removed ${us} from ${guild.name}'s no prefix`)]}) } } } if(op === `show` || op === `list`) { let pk = args[1] if(pk === `all`) { let db = await client.data2.get(`noprefix_${client.user.id}`); if(!db || db === null) { return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:white_check_mark: | No Users.`)]}) } let lol = []; let index = 1; db.forEach(x => lol.push(`\`${index++}\` <@${x}> | ${x}`)); let embed = new EmbedBuilder().setColor(client.config.color).setDescription(lol.sort().join('\n')).setAuthor({name : `| All Server's No prefix List`,iconURL : message.author.displayAvatarURL({dynamic:true})}); return message.channel.send({embeds : [embed]}); } else{ let guild = await client.guilds.fetch(args[1]) if(!guild) { return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:x: | Please provide me a valid server`)]}) } let db = await client.data.get(`noprefix_${guild.id}`); if(!db || db === null) { return message.channel.send({embeds : [new EmbedBuilder().setColor(client.config.color).setDescription(`:x: | No Users`)]}) } let lu = []; let index = 1; db.forEach(x => lu.push(`\`${index++}\` <@${x}> | ${x}`)); let eme = new EmbedBuilder().setColor(client.config.color).setDescription(lu.sort().join('\n')).setAuthor({name : `| ${guild.name}'s No prefix List`,iconURL : guild.iconURL({dynamic : true})}); return message.channel.send({embeds : [eme]}); } } } catch(e) { console.log(e) } }}
问题分析与解决方法
1. 核心报错原因
报错指向第31行的client.data2.get(),说明client.data2对象未定义——机器人启动时没有正确初始化或挂载这个数据库实例。
2. 具体修复步骤
检查数据库实例挂载:
打开机器人主文件(如index.js),确认是否正确初始化了data2并赋值给client对象。以QuickDB为例,正确代码应类似:const { QuickDB } = require('quick.db'); client.data = new QuickDB(); client.data2 = new QuickDB({ table: 'noprefix' }); // 确保该行存在若仅初始化了
client.data而无client.data2,就会触发报错。修正数据库调用混用问题:
代码中多处出现client.data和client.data2混用的情况,需统一改为client.data2:- 第33行:
client.data.set(noprefix_${client.user.id},[])→client.data2.set(...) - 第93行:同上,改为
client.data2.set(...) - 第138行:
client.data.get(noprefix_${guild.id})→client.data2.get(...)
- 第33行:
添加数据库实例存在性检查:
在命令开头添加检查,避免未初始化时执行后续代码:if (!client.data2) { return message.channel.send({ embeds: [new EmbedBuilder() .setColor(client.config.color) .setDescription(`:x: | 数据库服务未正常初始化,请联系管理员`) ] }); }修复功能逻辑错误:
代码中存在判断逻辑错误,第65行和第105行判断用户是否已存在时,错误使用了message.author.id(命令执行者ID),应改为目标用户的us.id:// 原代码 if(oo.includes(message.author.id)) // 修改后 if(oo.includes(us.id))
3. 测试验证
修复后重启机器人,测试noprefix命令的所有子功能(add/remove/show),确认报错消失且功能正常。
内容的提问来源于stack exchange,提问作者Night Mary
相关产品推荐
相关产品推荐

