2016-04-05 2 views
0

У меня одновременно есть несколько пользователей, и они могут писать один и тот же файл одновременно. Как предотвратить столкновение файла, когда несколько пользователей пишут один файл в узле nodejs.Отдельный файл, написанный несколькими пользователями в nodejs

+0

Пожалуйста, поделитесь своим случаем использования –

+0

В основном, в моей системе одновременно регистрируются многие пользователи, и они меняют вещи на экране, которые отправляются на сервер через веб-сокеты, все эти изменения должны быть сохранены в одном файле. Поэтому я должен принять (на стороне сервера) все изменения, внесенные пользователями. Фактически, я должен добавить каждое из этих изменений в один файл. Но я не могу просто написать в файле, так как есть вероятность того, что файл уже написан. Так что, возможно, мне нужно посмотреть, как выглядит очередь, где мой файл обновляется на основе того, какой запрос пришел первым. – Umer

ответ

0

Предполагая, что у вас есть только один процесс узла, решение будет состоять в использовании fs.writeFileSync.

Правильный способ сделать это - использовать rwlock для правильной блокировки файла, чтобы он мог писать только один процесс за раз.

0

Ну, 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, не блокируя весь цикл событий, не забывайте быть асинхронными когда-либо!

+0

в основном, в моей системе одновременно регистрируются многие пользователи, и они меняют вещи на экране, которые отправляются на сервер через веб-сокеты, все эти изменения должны быть сохранены в одном файле. Поэтому я должен принять (на стороне сервера) все изменения, внесенные пользователями. Нужна ли мне какая-то дополнительная вещь или будет ли нижний код работать нормально? // На стороне сервера у меня есть такая вещь: socket.on ('newObject', function (data) { fs.writeFileSync (......); // данные добавляются в файл. } – Umer