node.js 如何处理事件

问题描述 投票:0回答:1

我刚刚开始学习node.js,不太了解node.js如何处理事件。我在使用事件处理程序时遇到问题(多次调用同一事件)并出现意外行为。

问题来了,

我创建了一个名为 userlist.txt 的文本文件,其中包含空数组,并且我尝试在用户登录时将用户添加到 userlist.txt 文件中。我期待这样的结果:- ["jhon", "smith", "jos", "test"] 但最终得到这样的结果:- ["Test"]] 或 ["Jos"]]],需要帮助来理解这种行为以及 Node.js 如何处理事件 Code referencegetting this output although output is not stable

这是代码:-

const fs = require('fs');
const EventEmmiter = require('events');
const login = new EventEmmiter();

login.on("login",async(username)=>{
    try {
        const userList = await fs.promises.readFile("./userlist.txt", 'utf-8');
        const parsedUserList = JSON.parse(userList);
        parsedUserList.push(username);
        await fs.promises.writeFile("./userlist.txt", JSON.stringify(parsedUserList))
        
        console.log(`user logged in successfully... ${username}`);
    } catch (error) {
        console.log(error);
    }
})

login.emit("login", "Jhon");    
login.emit("login", "Smith");
login.emit("login", "Jos");
login.emit("login", "Test");
javascript node.js node-modules
1个回答
0
投票

这并不是真正关于

EventEmitter
– 您有一个经典的竞争条件,只需使用
async function login(name) {}
即可重现。

当您进行异步 IO(读取和写入文件)时,事件处理程序调用会被挂起,因此同一处理程序的其他调用会获得不同的数据视图,并且还会与另一个写入数据发生冲突(例如,您'会丢失写入)。

最坏的情况,你甚至会有一个处理程序读取一个空文件(因为

writeFile
调用将以截断模式打开文件,但可能没有时间写入它),然后
JSON.parse()
将失败,读取空字符串。

© www.soinside.com 2019 - 2024. All rights reserved.