Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用node.js无法正确保存Json_Node.js_Fs - Fatal编程技术网

使用node.js无法正确保存Json

使用node.js无法正确保存Json,node.js,fs,Node.js,Fs,我已连接到websocket,每次收到消息时,我都会将其内容保存到json文件中。如果我在同一秒内收到两条或更多消息,则无法正确保存。如何防止这种情况发生?每次收到消息时,我都在使用: fs.readFile(bought_path,'utf-8',(err,data) =>{ ... //do something 读取json文件,以及 fs.writeFile(bought_path, JSON.stringify(kupljeni_itemi) , 'utf-8'); 保

我已连接到websocket,每次收到消息时,我都会将其内容保存到json文件中。如果我在同一秒内收到两条或更多消息,则无法正确保存。如何防止这种情况发生?每次收到消息时,我都在使用:

  fs.readFile(bought_path,'utf-8',(err,data) =>{ ...
  //do something
读取json文件,以及

fs.writeFile(bought_path, JSON.stringify(kupljeni_itemi) , 'utf-8');

保存已编辑的json文件。

保护的一种方法是制作一个简单的锁定机制:

let isLocked = false; // declare it in an upper scope.

if (!isLocked) { // check if it is not locked by other socket call.
  isLocked = true; // set the lock before writing the content
  fs.writeFile(file, json, (err) => {
    isLocked = false; // unlock when you get the response
  })
}

您可以使用同步读/写函数-
readFileSync
writeFileSync

这很酷,但是如果资源被锁定,您需要一个
else
块来重新请求写入。这是一个糟糕的想法:您正在降低所有请求的性能,以修复间歇性问题。这完全取决于服务器处理的请求的性质。如果大多数请求都是文件操作,那么我看不出在实现锁定和同步操作方面有什么区别。node.js存在的全部意义(参见Ryan Dahl发布它时的文章)在于它是一个基于非阻塞事件循环的服务器。如果要阻止每个文件io,那么为什么要使用node呢?我不是说同步版本没有用处,它们是存在的,但它们不是用于生产代码。我同意你的观点。但是,同样地,要在一种为异步编程设计的语言中实现同步,您必须权衡一些性能。在下面使用lock的解决方案中,关于重新排队写入请求,如果您在没有时间间隔的情况下不断地重新排队,那么实际上是在使用cpu时间,什么也不做。另一方面,如果您以一定的时间间隔重新申请,那么如果服务器处于空闲状态,并且此时不接受任何其他请求,该怎么办?重点是,没有解决方案是一个糟糕的想法(特别是当它作为本机api的一部分提供时)。这并不能准确地回答您的问题,但我正在考虑的一种方法是,如果确实出现这些问题,请在读取文件时使用类似于包的东西来解决这些问题。