Как «правильно» избежать состояния гонки при чтении / записи файлов при использовании NodeJs вместе с программным обеспечением C ++? - PullRequest
1 голос
/ 03 августа 2020

У меня есть простой интерфейс, который принимает некоторые входные значения, отправляет их через сообщение AX IOS на сервер ExpressJS, который записывает их в файл. Тот же самый файл через случайный интервал времени проверяется на наличие новых значений другой частью программного обеспечения C ++. Я пошел путем создания .lock файлов, связанных с .txt файлами, которые я хочу читать / писать. Итак, C ++ открывает файл .lock, чтобы получить дескриптор файла, а затем блокирует его, используя этот дескриптор файла. Если блокировка успешна, он продолжает открывать, записывать и закрывать файл .txt. После этого он открывает и закрывает .lock.

Теперь я проделал то же самое со стороной ExpressJS:

app.post("/dhcpIP", function(req, res) {
  if (req.body.constructor === Object && Object.keys(req.body).length === 0) {
    return res.status(500).send("ERROR: Inputs are empty !");
  }

  let fileText = req.body;
  console.log("fileText: ");
  console.log(fileText);

  const dhcpcd_lock = fs.openSync(dhcpcd_lock_path, "w+");

  flock(dhcpcd_lock, "ex", (err) => {
    if (err) return console.error("Could not lock file.");

    console.log("dhcpcd_lock is locked.");

    const write_to_file = fileText;
    fs.writeFile(
      path.join(configFilesLocation, "/configuration.txt"),
      write_to_file,
      (error) => {
        if (error) return console.error(error);
        console.log("configuration.txt was saved");

        flock(dhcpcd_lock, "un", (error) => {
          if (error) return console.error(error);          

          console.log("File is unlocked.");
          res.sendStatus(200);

          fs.closeSync(dhcpcd_lock);
        });
      }
    );
  });
});

Как видите, я ' Мы вложили код в обратные вызовы асинхронных c функций:

  • fs.writeFile() внутри flock('ex') обратный вызов
  • flock('un') внутри fs.writeFile() обратный вызов
  • res.sendStatus(200); и fs.closeSync(dhcpcd_lock); находятся внутри flock('un') обратный вызов

Я не знаю, правильный ли это способ делать что-то, потому что я делаю это впервые. Я не знаю, можно ли использовать openSync и closeSync для открытия и закрытия файла блокировки, а другие функции должны быть асинхронными (flock, fs.writeFile). Должен ли я использовать asyn c open, а затем вложить код в его обратный вызов и, наконец, использовать asyn c close?

Как изменится приведенный выше код, если мне нужно написать два файлы в одном обработчике app.post()? Придется ли мне делать все синхронно?

...