2015-02-24 62 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();