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

Twitch机器人触发未知指令报command is not a function崩溃如何解决

问题根因

你的代码崩溃的核心问题出在命令存在性的判断逻辑错误:

  • 原判断语句if (commandName in knownCommands || knownCommandsMod)的右侧条件仅校验knownCommandsMod对象本身是否为真值(只要该对象被定义且不为空/null/undefined就会判定为真),不会校验commandName是否存在于knownCommandsMod中,导致所有带前缀的指令都会进入执行分支,else分支永远不会被触发
  • 当输入不存在的指令时,knownCommands[commandName]和knownCommandsMod[commandName]均为undefined,后续执行command(target, context, params)本质是调用undefined作为函数,直接触发程序崩溃

修复方案

修改命令存在性判断逻辑,同时可加一层函数存在性校验避免偶发异常,修复后代码如下:

// 注册事件监听函数
client.on("message", onMessageHandler);
client.on("connected", onConnectedHandler);
client.on("disconnected", onDisconnectedHandler);

// 连接Twitch服务
client.connect();

// 每次收到消息时触发
function onMessageHandler(target, context, msg, self) {
  if (self) {
    return;
  } // 忽略机器人自己发送的消息

  // 没有命令前缀的消息不属于指令,直接返回
  if (msg.substr(0, 1) !== commandPrefix) {
    console.log(`[${target} (${context["message-type"]})] ${context.username}: ${msg}`)
    return
  }

  // 拆分消息内容为独立字段
  const parse = msg.slice(1).split(" ");
  // 取第一个字段为指令名
  const commandName = parse[0];
  // 剩余字段为指令参数
  const params = parse.splice(1);
  
  // 修复点:校验指令名是否存在于两个指令集合中
  if (commandName in knownCommands || commandName in knownCommandsMod) {
    // 获取对应指令的执行函数
    const command = knownCommands[commandName] || knownCommandsMod[commandName]
    // 额外校验确保获取到的是可执行函数,避免异常崩溃
    if (typeof command === 'function') {
      // 传入参数执行指令
      command(target, context, params)
      console.log(`* 为用户${context.username}执行了${commandName}指令`)
    } else {
      console.log(`* 用户${context.username}发送的${commandName}不是合法可执行指令`)
    }
  } else {
    console.log(`* 用户${context.username}发送了未知指令${commandName}`)
  }
}

内容的提问来源于stack exchange,提问作者smuggie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:09:03