У меня одновременно есть несколько пользователей, и они могут писать один и тот же файл одновременно. Как предотвратить столкновение файла, когда несколько пользователей пишут один файл в узле nodejs.Отдельный файл, написанный несколькими пользователями в nodejs
ответ
Предполагая, что у вас есть только один процесс узла, решение будет состоять в использовании fs.writeFileSync
.
Правильный способ сделать это - использовать rwlock для правильной блокировки файла, чтобы он мог писать только один процесс за раз.
Ну, fs.writeFileSync
блокирует цикл событий и блокирует остальные ваши асинхронные функции в очереди событий узла. Другим и лучшим подходом является использование модуля, такого как semaphore
.
var sem = require('semaphore')(1);
var server = require('http').createServer(req, res) {
res.write("Start your file write sir");
sem.take(function() {
// Process your write to file using fs.writeFile
// And finish the request
res.end("Bye bye, your file write is done.");
sem.leave();
});
});
Это будет блокировать любой другой запрос HTTP, не блокируя весь цикл событий, не забывайте быть асинхронными когда-либо!
в основном, в моей системе одновременно регистрируются многие пользователи, и они меняют вещи на экране, которые отправляются на сервер через веб-сокеты, все эти изменения должны быть сохранены в одном файле. Поэтому я должен принять (на стороне сервера) все изменения, внесенные пользователями. Нужна ли мне какая-то дополнительная вещь или будет ли нижний код работать нормально? // На стороне сервера у меня есть такая вещь: socket.on ('newObject', function (data) { fs.writeFileSync (......); // данные добавляются в файл. } – Umer
Пожалуйста, поделитесь своим случаем использования –
В основном, в моей системе одновременно регистрируются многие пользователи, и они меняют вещи на экране, которые отправляются на сервер через веб-сокеты, все эти изменения должны быть сохранены в одном файле. Поэтому я должен принять (на стороне сервера) все изменения, внесенные пользователями. Фактически, я должен добавить каждое из этих изменений в один файл. Но я не могу просто написать в файле, так как есть вероятность того, что файл уже написан. Так что, возможно, мне нужно посмотреть, как выглядит очередь, где мой файл обновляется на основе того, какой запрос пришел первым. – Umer