变量不是全局变量或文件系统 readfile 太慢

variable not global or file system readfile is too slow

我正在尝试使用 Electron 和 tmi.js 存储库制作 Twitch 机器人,我希望程序将数据(例如用户名、OAuth 令牌等)保存在 .json 中文件。当我重新打开我的应用程序时,它会立即读取文件并创建一个包含所有设置的选项对象(对于 twitch api)。一切正常,但是来自 tmi.js 存储库的 client.on 事件给我一个错误:"Cannot read property 'on' of undefined".

读取文件代码:

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 文件和设置变量之前被调用。

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

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

的有趣读物

您的问题的解决方案是处理代码的异步性质或使用 readFileSync(documentation),这是 readFile.

的同步版本