Discord.js机器人运行出现读取name、toJSON未定义报错求助
问题原因与解决方法
两个报错的核心诱因完全相同:你新增的./commands目录下至少有一个命令文件没有按Discord.js的规范导出data属性,导致代码读取command.data时拿到undefined,进一步触发属性读取报错。
排查修复步骤
确认命令文件的标准结构
每个放在./commands目录下的命令文件必须按以下结构导出内容,你可以对照检查新增的文件:const { SlashCommandBuilder } = require('discord.js'); module.exports = { // 必须要有data属性,用SlashCommandBuilder构建 data: new SlashCommandBuilder() .setName('test') // 必须调用setName设置命令名,对应command.data.name .setDescription('测试命令'), // 必须要有execute方法处理命令执行逻辑 async execute(interaction) { await interaction.reply('测试响应'); } };重点检查易出错的点
- 有没有漏写
module.exports,漏写导出的话require拿到的是空对象,找不到data属性 data属性有没有拼写错误,比如写成Data、datas这类大小写/拼写错误- 有没有给
data调用setName方法,漏写的话data.name会是undefined
- 有没有漏写
快速定位出错文件
可以在读取命令的循环中加入调试代码,直接找到有问题的文件:
运行后控制台会直接输出不符合规范的文件名,针对性修改即可。for (const file of commandFiles) { const command = require(`./commands/${file}`); // 新增调试代码 if (!command?.data?.name) { console.log(`存在问题的命令文件:${file}`); continue; } client.commands.set(command.data.name, command); }
修改完成后先重新运行node deploy-commands.js注册命令,再启动机器人即可恢复正常。
内容的提问来源于stack exchange,提问作者IamTheHaze
相关产品推荐
相关产品推荐

