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
相关产品推荐
相关产品推荐

