我有一个接收文件的rest api。我的node-application存储在本地存储中的每个文件被添加到xml& json文件。 如何防止应用程序几乎不在文档中同时写入两个文件,这会导致文档无效。
目前我将所有文件放入一个数组中,只保存数组中的最后一个文件。这可以防止xml / json文档只被访问一次。
this.files = new Array();
this.running = false;
this.app.push('/file', function(req, res){
this.files.add(req.body.file);
if(!this.running)
this.storeFile();
}
this.storeFile = function(){
this.running = true;
fs.write(files[files.length-1], this.succ, this.err);
this.succ(){
files.splice(fileIndex);
if files.length greater than 0
app.storeFile();
else
this.running = false;
}
这并不能阻止同时写入多个文件。如果running = false,则两个推送事件几乎同时进入。循环执行两次,每个文件存储两次。并且访问/打开/写入xml / json文件两次,这会导致错误/异常。
答案 0 :(得分:0)
这是一个如何使用共享资源类型的问题来处理并发。解决此问题的最快方法是使用数据库,其他开发人员已经通过ACID兼容事务解决了这个问题。
另一种解决方案取决于代码的结构和期望。您可以锁定文件以进行写入或使用信号量来控制对文件的访问,但由于您正在使用和重写文件存储的数据,因此可能会发生某些更改将丢失或某些锁定将持续到超时等等...避免此问题的另一种方法是事件源,其中您总是附加文件,但从不覆盖。