将tmi.js命令拆分到commands.js后无法运行,求排查解决
问题排查与解决
你的代码拆分后无响应,核心是两个问题:
1. 命令处理函数未接收必要参数
拆分后的index.js里,调用commands()时没传递channel、tags、message、self这些关键参数,导致commands.js里的message变量为undefined,根本匹配不到!hello命令。
修正方式:
修改index.js的调用代码,把参数传进去:
client.on('message', (channel, tags, message, self) => { if(self) return; // 传递所有必要参数 commands(channel, tags, message, self); });
2. commands.js无法访问client实例
client是在index.js中创建的,commands.js直接用client会触发变量未定义错误,就算参数传对了,client.say也无法执行。
方案一:将client作为参数传入
修改commands.js,新增client参数:
// commands.js module.exports = function (client, channel, tags, message, self) { if(message.toLowerCase() === '!hello') { client.say(channel, `@${tags.username}, heya!`); } }
然后在index.js调用时传入client:
client.on('message', (channel, tags, message, self) => { if(self) return; commands(client, channel, tags, message, self); });
方案二:用工厂函数绑定client(更优雅)
重构commands.js,导出一个接收client的工厂函数,返回消息处理逻辑:
// commands.js module.exports = function(client) { return function(channel, tags, message, self) { if(message.toLowerCase() === '!hello') { client.say(channel, `@${tags.username}, heya!`); } // 后续新增命令可直接在这里扩展 } }
然后在index.js中初始化命令处理器:
// index.js const tmi = require('tmi.js'); const createCommandsHandler = require('./commands'); const client = new tmi.Client({ options: { debug: true }, channels: [ 'my_name' ] }); // 传入client创建命令处理器 const commands = createCommandsHandler(client); client.connect(); client.on('message', (channel, tags, message, self) => { if(self) return; commands(channel, tags, message, self); });
另外注意:你在index.js里重复require('./commands')了,删掉其中一个即可。
内容的提问来源于stack exchange,提问作者José
相关产品推荐
相关产品推荐

