У меня есть простой интерфейс, который принимает некоторые входные значения, отправляет их через сообщение 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()
? Придется ли мне делать все синхронно?