Переменная не глобальная или файл чтения файловой системы слишком медленный

Я пытаюсь создать Twitch Bot, используя Electron и репозиторий tmi.js, и я хочу, чтобы программа сохраняла данные (например, имя пользователя, токен OAuth и т. Д.) В файле.json. Когда я снова открываю свое приложение, оно мгновенно читает файл и создает объект параметров со всеми настройками (для twitch апи). Это все работает нормально, но событие client.on из репозитория tmi.js выдает мне сообщение об ошибке: "Не удается прочитать свойство" on "из 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");
})

переменная client объявляется в верхней части файла с помощью команды let client;

Но если я вызову такую ​​функцию:

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

все работает нормально, поэтому я предполагаю, что клиент на событии чата внизу как-то вызывается раньше, чем читается файл.json и устанавливаются переменные.

Есть идеи, как я могу это исправить?

1 ответ

Решение

Проблема с вашим кодом в том, что вы используете fs.readFile который имеет асинхронный характер. это означает, что скрипт не будет ждать завершения операции чтения json, он будет продолжать выполнять построчно. Таким образом, после readFile ваш код выполняет client.on событие. Вот интересное прочтение об асинхронном JavaScript

Решением ваших проблем является то, что вы либо обрабатываете асинхронную природу кода, либо используете readFileSync( документация), которая является синхронной версией readFile,

Другие вопросы по тегам