使用module.exports拆分discord.js机器人代码时出现execute属性读取错误
问题原因
你在message.js中对commandinit.js的导出内容使用了错误的解构赋值。commandinit.js通过module.exports直接导出的是一个包含name、execute属性的对象,并没有对外暴露名为commandinit的属性,因此解构得到的commandinit变量为undefined,调用undefined.execute自然会抛出你遇到的类型错误。
解决方案
方案1(更推荐,修改导入逻辑)
直接将commandinit.js导出的整个对象赋值给变量,不需要解构,修改message.js中的导入代码即可:
// 原来的错误写法 const{ commandinit } = require(`./commandinit.js`); // 替换为正确写法 const commandinit = require(`./commandinit.js`);
修改后后续的commandinit.execute()调用即可正常运行。
方案2(保留解构写法,修改导出逻辑)
如果你希望保留解构的导入写法,可以修改commandinit.js的导出结构,将功能对象挂载到commandinit属性下:
// commandinit.js 修改后的导出代码 module.exports = { commandinit: { name: 'commandinit', execute(client, message, command){ // 原有逻辑 } } };
额外优化建议
- 修正命令触发的判断逻辑:你当前写的
if(message.content.startsWith("-") || !message.author.bot)使用了或运算符||,会导致所有普通用户发送的非命令消息也进入命令处理流程,应该改为与运算符&&,仅处理普通用户发送的带-前缀的消息:
if(message.content.startsWith("-") && !message.author.bot)
- 建议将
require导入语句统一放在文件顶部,不要写在execute函数内部:Node.js的模块加载是同步操作,写在函数内部会每次调用函数都触发一次加载逻辑(虽然有模块缓存不会重复加载,但不符合常规编码规范,可读性也更差)。
内容的提问来源于stack exchange,提问作者kaunie
相关产品推荐
相关产品推荐

