我正在尝试使用Electron和tmi.js存储库制作一个Twitch Bot,我希望程序将数据(例如用户名,OAuth令牌等)保存在.json文件中。当我重新打开应用程序时,它会立即读取文件并创建具有所有设置的选项对象(适用于twitch
API)。一切正常,但是tmi.js存储库中的client.on事件给我一个错误:“无法读取未定义的属性'on'”。
读取文件代码:
fs.readFile("connectionSettings.json", (err, data) => {
if (err){
console.log(err);
} else {
channelData = JSON.parse(data);
options = {
options: {
debug: true
},
connection: {
cluster: "aws",
reconnect: true
},
identity: {
username: channelData[1],
password: channelData[2]
},
channels:[channelData[0]]
};
client = new tmi.client(options);
client.connect();
}
})
聊天事件中的客户端:
client.on("chat", function(channel, userstate, message, self) {
mainWindow.webContents.send("message:add", userstate.username, message);
console.log("message");
})
client变量在文件顶部用“ let client;”声明。
但是,如果我调用这样的函数:
function sendMessage(msg) {
client.say(options.channels[0].replace("#",""), msg)
}
一切正常,因此我假设在底部聊天事件的客户端以某种方式早于读取.json文件并设置变量的方式调用。
有什么想法我可以解决这个问题吗?
答案 0 :(得分:0)
您的代码存在问题,因为您使用的是fs.readFile
,它本质上是异步的。这意味着脚本不会等待json读取操作完成,它将继续逐行执行。因此,在readFile之后,您的代码然后直接执行client.on
事件。这是有关 asynchronous javascript
解决方案是您要么处理代码的异步性质,要么使用readFileSync
的同步版本readFile
(documentation)。