2016-03-15 29 views

回答

0

你应该写一个模块名称logs或你喜欢什么。

logs.js

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

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

然后你socket.io相关模块中只需要在上面像

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

模块,并像这样在写消息socket.io回调! :)

logs.write('datatobewritten');

底线 “使用fs.createWriteStream代替fs.writefile

希望这是有道理:)

8

你必须写操作同步。

对于你的NodeJS可以使用简单的队列,像这样一个实例:

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

多进程情况下,你必须使用一些锁定,例如与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'); 
    }); 
} 

为了获得更好的性能,你甚至可以在这里结合2点的方法。

+1

我有多个进程写入文件,我将如何结合这两种方法? – chovy

相关问题