2015-02-24 59 views
0

我的nodejs应用程序是围绕“项目文件”构建的。原子写入/读取nodejs中的文件

这个应用程序的几个模块(由我的项目的“模块”,我的意思是一个简单的JavaScript文件)需要加载,修改并经常保存这个文件,通过流(fs.createReadStream,fs.createWriteStream)这些模块彼此独立执行,有时源自websocket事件(例如),我需要对项目文件原子进行保存/加载操作。

这意味着以下情形:

  1. moduleA写在同一时间的项目文件
  2. ,和之前moduleA已完成写入文件,moduleB想读它=>理想情况下,应该等待moduleA的写操作(目前,它读取部分写入的文件和检测错误)之前,认真阅读文件

是的NodeJS能够原生地做到这一点还是我必须建立一种原子包装的在我的读/写流系统上?

回答

1

据我所知,没有内置任何东西。有一些模块,比如redis-lock,虽然它实现了锁机制。 如果你在一个非集群服务器上运行,你可能可以应付实现一个简单的本地锁。

1

这可能会给你一个想法:

var Fs = require("fs"), 
    LOCK = require ("os").tmpdir() + '/foo-lock.'; 

function transLock(id, cb) { 
    Fs.open(LOCK + id, "wx", function(err, fd) { 
    if (err) { 
     // someone else has created the file 
     // or something went wrong 
     cb(err); 
    } else { 
     Fs.close(fd, function(err) { 
     // there should be no error here except weird stuff 
     // like EINTR which must be ignored on Linux 
     cb(); 
     }); 
    } 
    }); 
} 


function transUnlock(id) { 
    Fs.unlink(LOCK + id, function(err) { 
    if (err) { 
     // something is wrong and nothing we can do except 
     // perhaps log something or do some background cleanup 
    } 
    }); 
} 

function main() { 
    var id = "some-unique-name"; 

    transLock(id, function(err) { 
    if (err) 
     console.log(err); 
    else { 
     // ... do your stuffs ... 
     transUnlock(id); 
    } 
    }); 
} 

main();