原子写入/读取nodejs中的文件

时间:2015-02-24 17:02:01

标签: node.js save load atomic

我的nodejs应用程序是围绕"项目文件"构建的。

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

这意味着以下情况:

  1. moduleA编写项目文件
  2. 同时,在moduleA完成写入文件之前,moduleB想要读取它=>理想情况下,它应该等到moduleA的写操作(当前,它读取部分写入的文件并检测错误)才真正读取文件
  3. nodejs能够原生地执行此操作,还是必须在读/写流系统上构建一种原子包装器?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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();