2016-03-15 20 views
6

Come gestire le richieste di scrittura file simultanee su un server nodo con socket.io. Sto usando questo per scrivere:Come gestire le richieste di scrittura di file simultanee su un server nodo con socket.io

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

Ho un file abc.txt e suppongo che due utenti tentano di scrivere allo stesso tempo su questo file allora sto ottenendo un errore, così come faccio a coda di richieste multiple.

+0

provare a scrivere come metodi di sincronizzazione –

risposta

0

Dovresti scrivere un nome modulo logs o qualsiasi cosa desideri.

logs.js

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

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

Poi, nel tuo modulo relativo socket.io richiedono solo il modulo nella parte superiore come

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

e scrivere un messaggio come questo in socket.io callbacks! :)

logs.write('datatobewritten');

Linea di fondo "utilizzare fs.createWriteStream invece di fs.writefile"

Spero che questo ha un senso :)

8

È necessario sincronizzare le scritture.

Per una singola istanza di nodejs è possibile utilizzare semplice coda, in questo modo:

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(); 
     } 
    } 
} 

In multi-processo esempio è necessario utilizzare qualche bloccaggio, per esempio con 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'); 
    }); 
} 

Per ottenere migliori prestazioni si può anche combinare 2 approcci qui.

+1

Ho più processi che scrivono nel file, come dovrei combinare questi due approcci? – chovy

Problemi correlati