Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用node.js写入文件系统的非阻塞方式_Node.js - Fatal编程技术网

使用node.js写入文件系统的非阻塞方式

使用node.js写入文件系统的非阻塞方式,node.js,Node.js,我已经用node.js编写了一个非阻塞tcp服务器。此服务器侦听端口并通过http.request()将请求重新路由到其他服务器 要重新路由邮件的备份日志,我希望将每条邮件(单行信息)附加到一个文件中,并将日期作为文件名 服务器将被几个具有小txt字符串(800字节)的设备以交替间隔击中。隐式写入文件系统会调用阻塞事件。有没有办法防止这种行为???只需使用fs模块的异步方法,如appendFile 只需使用fs模块的异步方法,如appendFile 如果appendFile工作不正常,我自己测试

我已经用
node.js
编写了一个非阻塞tcp服务器。此
服务器
侦听端口并通过
http.request()将请求重新路由到其他服务器

要重新路由邮件的备份日志,我希望将每条邮件(单行信息)附加到一个文件中,并将日期作为文件名


服务器将被几个具有小txt字符串(800字节)的设备以交替间隔击中。隐式写入文件系统会调用阻塞事件。有没有办法防止这种行为???

只需使用
fs
模块的异步方法,如
appendFile


只需使用
fs
模块的异步方法,如
appendFile


如果appendFile工作不正常,我自己测试了一个解决方案,使用文件流可以处理多个集群,如果appendFile工作不正常,就不会破坏输出,我自己使用文件流测试了一个解决方案,该解决方案可以与多个集群一起工作,并且不会破坏输出,类似的方法可能会有所帮助

    var fs = require('fs');
    var writer = {
      files: {},
      appendFile: function(path, data) {
        if(this.files[path] === undefined) {
          this.files[path] = {open: false, queue: []};
        }
        this.files[path].queue.push(data);
        if(!this.files[path].open) {
          this.files[path].open = true;
          this.nextWrite(path);
        }
      },
      nextWrite: function(path) {
        var data = this.files[path].queue.shift(),
            self = this;
        if(data === undefined)
          return this.files[path].open = false;
        fs.appendFile(path, data, function(err) {
          if (err) throw err;
          self.nextWrite(path);
        });
      }
    }
它要求fs.appendFile的node版本为0.8.0,但它为每个文件保留一个队列,然后按照添加的顺序追加内容。它很管用,但我没有花太多时间在上面。。因此,仅将其用于教育目的

   writer.appendFile('test.txt','hello');

像这样的东西可能会有帮助

    var fs = require('fs');
    var writer = {
      files: {},
      appendFile: function(path, data) {
        if(this.files[path] === undefined) {
          this.files[path] = {open: false, queue: []};
        }
        this.files[path].queue.push(data);
        if(!this.files[path].open) {
          this.files[path].open = true;
          this.nextWrite(path);
        }
      },
      nextWrite: function(path) {
        var data = this.files[path].queue.shift(),
            self = this;
        if(data === undefined)
          return this.files[path].open = false;
        fs.appendFile(path, data, function(err) {
          if (err) throw err;
          self.nextWrite(path);
        });
      }
    }
它要求fs.appendFile的node版本为0.8.0,但它为每个文件保留一个队列,然后按照添加的顺序追加内容。它很管用,但我没有花太多时间在上面。。因此,仅将其用于教育目的

   writer.appendFile('test.txt','hello');

问题在于不能将a同步写入不同的文件;但是a-同步到同一个文件。我可能遗漏了一些东西,但是如果您写入同一个文件而不是不同的文件,会有什么不同
appendFile
在任何情况下都会立即返回。连接1:将消息追加到文件A;在它结束对它的写入之前,另一个连接尝试将另一条消息附加到文件A。如果文件被缓冲(它是这样的),我看不出这将是一个什么问题。在Node.js中,文件写入是异步的,但它们通常不是并发的,是吗?我认为这里的答案显然不是使用appendFile,而是打开文件一次并使用写入流,这将确保条目按照写入文件的顺序写入;但是a-同步到同一个文件。我可能遗漏了一些东西,但是如果您写入同一个文件而不是不同的文件,会有什么不同
appendFile
在任何情况下都会立即返回。连接1:将消息追加到文件A;在它结束对它的写入之前,另一个连接尝试将另一条消息附加到文件A。如果文件被缓冲(它是这样的),我看不出这将是一个什么问题。在Node.js中,文件写入是异步的,但它们通常不是并发的,是吗?我认为这里的答案显然不是使用appendFile,而是打开文件一次并使用写入流,这将确保条目按照写入文件的顺序写入。是的,WriteStream可能是解决方法。文档说,多次调用write()而不等待回调是不安全的。我无法想象appendFile会做出任何保证。是的,WriteStream可能是一种方式。文档说,多次调用write()而不等待回调是不安全的。我无法想象这个文件能做出任何保证。