You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:37:52