Как эффективно заблокировать текстовый файл при использовании его в NodeJS? - PullRequest
0 голосов
/ 23 января 2019

У меня есть несколько независимых скриптов для чтения и записи из одних и тех же текстовых файлов.Я пытаюсь заблокировать текстовые файлы, пока модуль читает / пишет из них.В данный момент я использую пакет lockfile, но он не работает.например,

//lock file before reading

lockFile.lockSync("./Config/presetString.txt.lock",10000,100,10000,1000,100)

//read file

var preset = fs.readFileSync("./Config/presetString.txt", 'utf8');

//unlock file

lockFile.unlockSync("./Config/presetString.txt.lock",10000,100,10000,1000,100)

Однако, когда запущено много модулей, иногда возникает ошибка, которая останавливает все.В сообщении об ошибке указано, что файл .lock уже существует.Это кажется нелогичным - если файл .lock уже существует, то модулям следует подождать, пока он не будет существовать. С указанными выше параметрами модули должны повторить попытку доступа к блокировке 1000 раз, но это не работает.

Любые идеи о том, как это предотвратить?

Вот пример ошибки, которая выдается:

Error: EEXIST: file already exists, open './Config/presetString.txt.lock'

1 Ответ

0 голосов
/ 23 января 2019

Из документации

Методы синхронизации возвращают значение / выдают ошибку, другие - нет. Стандартный узел fs stuff.

Вам необходимо проверить существующую блокировку и использовать обратный вызов

 // opts is optional, and defaults to {}
lockFile.lock('some-file.lock', opts, function (er) {
   // if the er happens, then it failed to acquire a lock.
   // if there was not an error, then the file was created,
   // and won't be deleted until we unlock it.

  //read file

   var preset = fs.readFileSync("./Config/presetString.txt", 'utf8');

   // do my stuff, free of interruptions
   // then, some time later, do:
lockFile.unlock('some-file.lock', function (er) {
   // er means that an error happened, and is probably bad.
   })
})
...