0

我正在尝试使用 Electron 和 tmi.js 存储库制作 Twitch Bot,我希望程序将数据(例如用户名、OAuth 令牌等)保存在 .json 文件中。当我重新打开我的应用程序时,它会立即读取文件并创建一个包含所有设置的选项对象(用于twitchapi)。一切正常,但是来自 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");
})

客户端变量在文件顶部用“let client;”声明。

但是如果我调用这样的函数:

function sendMessage(msg) {
    client.say(options.channels[0].replace("#",""), msg)
}

一切正常,所以我假设底部的聊天事件客户端在读取 .json 文件并设置变量之前以某种方式被调用。

有什么想法可以解决这个问题吗?

4

1 回答 1

0

您的代码的问题在于您使用fs.readFile的是异步性质的。这意味着脚本不会等待 json 读取操作完成,它将继续逐行执行。因此,在 readFile 之后,您的代码会直接执行该client.on事件。这是一篇关于异步 javascript的有趣读物

您的问题的解决方案是您要么处理代码的异步性质,要么使用readFileSync文档)这是readFile.

于 2018-10-14T17:20:56.073 回答