变量不是全局变量或文件系统 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
.
的同步版本
我正在尝试使用 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
.