переменная не глобальная или файл чтения файловой системы слишком медленный - PullRequest
0 голосов
/ 14 октября 2018

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

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

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

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

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

Любые идеи, как яможет это исправить?

1 Ответ

0 голосов
/ 14 октября 2018

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

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

...