2016-03-15 10 views
6

Jak obsługiwać równoczesne żądania zapisu pliku na serwerze węzła za pomocą socket.io. Używam tego napisać:Jak obsługiwać równoczesne żądania zapisu pliku na serwerze węzła za pomocą socket.io

fs.writefile('abc.txt','datatobewritten','utf8',function(err){}); 

Mam abc.txt plików i załóżmy dwa użytkownicy próbują pisać na tym samym czasie na tym pliku wtedy ja dostaję błąd, tak jak mam w kolejce wiele żądań.

+0

spróbuj pisać jako metody synchronizacji –

Odpowiedz

0

Powinieneś napisać nazwę modułu logs lub co chcesz.

logs.js

var fs = require('fs'); 
var writeStream = fs.createWriteStream('./abc.txt'); 

module.exports = { 
    /* PUSH */ 
    write: function (message, cb) { 
     writeStream.write(message, cb); 
    } 
} 

Następnie w module socket.io związane właśnie wymaga modułu w górnej jak

var logs = require('./logs');

i napisać wiadomość tak w wywołania zwrotne socket.io! :)

logs.write('datatobewritten');

Konkluzja "użytkowania fs.createWriteStream zamiast fs.writefile"

nadzieję, że to ma sens :)

8

trzeba zsynchronizować zapisy.

Dla jednej instancji nodejs można użyć prostego kolejkę, tak:

module.exports = function(path, content, cb){ 
    var queue = queues[path]; 
    if (queue == null) 
     queue = queues[path] = new Queue; 

    queue.add(path, content, (err) => { 
     cb(err); 
     queue.next(); 
    });   
}; 

var fs = require('fs'); 
var queues = {}; 

class Queue { 
    constructor() { 
     this.queue = []; 
    } 
    next() { 
     if (this.queue.length === 0) 
      return; 

     var [path, content, cb] = this.queue[0]; 
     fs.writeFile(path, content, 'utf8', (err) => { 
      this.queue.unshift(); 
      cb(err); 
     }); 
    }  
    add (...args) { 
     this.queue.push(...args); 
     if (this.queue.length === 1) { 
      this.next(); 
     } 
    } 
} 

W multi-proces instancja trzeba użyć jakiś zamek, na przykład z lockfile.

var lockFile = require('lockfile'); 
var fs = require('fs'); 


module.exports = function(path, content, cb) { 
    lockFile.lock('foo.lock', function (err) { 
     if (err) return cb(err); 

     fs.writeFile(path, content, cb); 
     lockFile.unlock('foo.lock'); 
    }); 
} 

Dla lepszej wydajności można nawet połączyć 2 podejścia tutaj.

+1

Mam wiele procesów zapisu do pliku, w jaki sposób połączyć te dwa podejścia? – chovy

Powiązane problemy