2016-03-15 10 views
6

Behandeln gleichzeitiger Schreibanforderungen für Dateien auf einem Knotenserver mit socket.io. Ich benutze dies zu schreiben:Behandeln von Schreibanforderungen für gleichzeitige Dateien auf einem Knotenserver mit socket.io

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

ich eine Datei abc.txt haben und nehmen wir an zwei Benutzer versuchen, auf der gleichen Zeit auf diese Datei zu schreiben, dann bin ich eine Fehlermeldung bekommen, so wie Warteschlange ich mehrere Anfragen.

+0

versuchen, als Sync-Methoden zu schreiben –

Antwort

0

Sie sollten eine Modulnamen logs oder was schreiben überhaupt wie Sie.

logs.js

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

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

Dann in Ihrem socket.io übergeordneten Modul benötigt nur das Modul an der Spitze wie

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

und die Nachricht in denen so schreiben socket.io Rückrufe! :)

logs.write('datatobewritten');

Unterm Strich "verwenden fs.createWriteStream statt fs.writefile"

Hoffnung das macht Sinn :)

8

Sie müssen die Schreib synchronisieren.

Für eine einzelne Instanz von NodeJS Sie einfach Warteschlange verwenden können, wie folgt aus:

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-Prozess- Instanz Sie einige Sperren verwenden, zum Beispiel mit 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'); 
    }); 
} 

Für eine bessere Leistung können Sie auch hier zwei Ansätze kombinieren.

+1

Ich habe mehrere Prozesse in die Datei schreiben, wie würde ich diese beiden Ansätze kombinieren? – chovy

Verwandte Themen