Discord.js动态命令处理中Context参数访问异常求助
问题分析与解决方案
我一眼就看出问题出在参数传递的顺序/数量不匹配上,咱们来拆解细节:
核心问题
在你的index.js中,调用命令的execute方法时传递了5个参数:
client.commands.get(command).execute( message, args, client, lobby, context );
但你的ping命令模块里,execute函数只定义了2个参数:
execute(message, context) { console.log(context.activeLang.ping[0]); }
这意味着第二个参数context实际上接收的是调用时的第二个值args(也就是用户输入的命令参数数组),而不是你期望的context对象。args数组显然没有activeLang属性,尝试访问args.activeLang.ping自然会抛出TypeError: Cannot read property 'ping' of undefined的错误。
两种解决方案
方案1:对齐参数顺序与数量
修改ping命令的execute函数,让参数列表和调用时的传递顺序完全一致:
module.exports = { name: 'ping', description: 'Ping!', // 这里的参数顺序要和index.js里的调用一一对应 execute(message, args, client, lobby, context) { console.log(context.activeLang.ping[0]); }, };
注意:所有命令模块的execute函数都要保持这个参数结构,避免出现同样的问题。
方案2:使用对象传参(更推荐)
如果觉得参数列表太长容易出错,可以把所有参数打包成一个对象传递,这样参数顺序就不再重要,还能灵活解构需要的参数:
首先修改index.js里的调用代码:
// 把参数打包成一个对象 client.commands.get(command).execute({ message, args, client, lobby, context });
然后修改ping命令模块的execute函数,通过对象解构获取需要的参数:
module.exports = { name: 'ping', description: 'Ping!', // 只解构需要的message和context即可 execute({ message, context }) { console.log(context.activeLang.ping[0]); }, };
这种方式的好处是,后续如果需要新增参数,只需要在调用时添加到对象里,不需要修改所有命令的参数列表,只在需要用到新参数的命令里解构即可,扩展性更强。
内容的提问来源于stack exchange,提问作者Leahnder
相关产品推荐
相关产品推荐

