我的nodejs应用程序是围绕"项目文件"构建的。
此应用程序的几个模块(通过"模块",我的意思是我项目的简单javascript文件)需要经常通过流(fs.createReadStream,fs.createWriteStream)加载,修改和保存此文件),并且由于这些模块彼此独立地执行,有时来自websocket事件(例如),我需要对项目文件原子进行保存/加载操作。
这意味着以下情况:
nodejs能够原生地执行此操作,还是必须在读/写流系统上构建一种原子包装器?
答案 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();