NodeJS阻止对文件的多次访问

时间:2014-08-19 06:06:44

标签: javascript node.js

我有一个接收文件的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文件两次,这会导致错误/异常。

1 个答案:

答案 0 :(得分:0)

这是一个如何使用共享资源类型的问题来处理并发。解决此问题的最快方法是使用数据库,其他开发人员已经通过ACID兼容事务解决了这个问题。

另一种解决方案取决于代码的结构和期望。您可以锁定文件以进行写入或使用信号量来控制对文件的访问,但由于您正在使用和重写文件存储的数据,因此可能会发生某些更改将丢失或某些锁定将持续到超时等等...避免此问题的另一种方法是事件源,其中您总是附加文件,但从不覆盖。