gpt4 book ai didi

node.js - 在 Node JS 中从不同的 'sessions' 读取/写入相同的文件内容是否有任何风险?

转载 作者:行者123 更新时间:2023-12-05 02:21:22 26 4
gpt4 key购买 nike

我是 Node JS 的新手,我想知道下面提到的代码片段是否有多 session 问题。

假设我有 Node JS 服务器(express)并且我监听了一些 POST 请求:

app.post('/sync/:method', onPostRequest);

var onPostRequest = function(req,res){

// parse request and fetch email list
var emails = [....]; // pseudocode

doJob(emails);

res.status(200).end('OK');
}

function doJob(_emails){

try {
emailsFromFile = fs.readFileSync(FILE_PATH, "utf8") || {};

if(_.isString(oldEmails)){
emailsFromFile = JSON.parse(emailsFromFile);
}

_emails.forEach(function(_email){

if( !emailsFromFile[_email] ){
emailsFromFile[_email] = 0;
}
else{
emailsFromFile[_email] += 1;
}
});

// write object back
fs.writeFileSync(FILE_PATH, JSON.stringify(emailsFromFile));

} catch (e) {
console.error(e);
};
}

所以 doJob 方法接收 _emails 列表,我更新(计数器 +1)这些来自从文件加载的对象 emailsFromFile 的电子邮件。

假设我同时收到 2 个请求,它会触发 doJob 两次。我担心当一个请求从文件中加载emailsFromFile时,第二个请求可能会更改文件内容。

有人可以阐明这个问题吗?

最佳答案

因为doJob()函数中的代码都是同步的,所以不存在多个请求导致并发问题的风险。

如果您在该函数中使用异步 IO,则可能会出现并发问题。

解释一下,node.js 中的 Javascript 是单线程的。因此,一次只有一个 Javascript 执行线程在运行,并且该执行线程一直运行到它返回事件循环为止。因此,任何完全同步的代码序列(如您在 doJob() 中的代码)都将在不中断的情况下运行至完成。

另一方面,如果您使用任何异步操作,例如 fs.readFile() 而不是 fs.readFileSync(),那么该执行线程将在您调用 fs.readFileSync() 时返回事件循环,并且可以在读取文件时运行另一个请求。如果是这种情况,那么您最终可能会遇到针对同一文件的两个请求发生冲突。在那种情况下,您将不得不实现某种形式的并发保护(某种标志或队列)。这是数据库提供大量功能的类型。

我有一个在使用大量异步文件 I/O 的 Raspberry Pi 上运行的 node.js 应用程序,我可能会与来自多个请求的代码发生冲突。我通过在写入特定文件的任何时候设置一个标志来解决它,并且任何其他想要写入该文件的请求首先检查该标志,如果设置了它,那么进入我自己的队列的那些请求将在之前的时候得到服务请求完成其写操作。还有很多其他方法可以解决这个问题。如果这种情况发生在很多地方,那么只需要一个提供此类写入争用功能的数据库就值得了。

关于node.js - 在 Node JS 中从不同的 'sessions' 读取/写入相同的文件内容是否有任何风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com