node.js - 异步文件追加

标签 node.js socket.io

在尝试学习 node.js/socket.io 时,我一直在创建一个简单的文件 uploader ,该文件 uploader 从客户端浏览器获取数据 block 并在服务器端重新组装。

用于接收 block 的socket.io事件如下所示:

socket.on('sendChunk', function (data) {
    fs.appendFile(path + fileName, data.data, function (err) {
      if (err) 
       throw err;
      console.log(data.sequence + ' - The data was appended to file ' + fileName);
    });
  });

问题在于,由于异步调用,数据 block 不一定按照接收顺序附加。典型的控制台输出如下所示:

  • 1 - 数据已附加到文件 testfile.txt
  • 3 - 数据已附加到文件 testfile.txt
  • 4 - 数据已附加到文件 testfile.txt
  • 2 - 数据已附加到文件 testfile.txt

我的问题是,以非阻塞方式实现此功能但强制顺序的正确方法是什么。我看过像 async 这样的库,但真的希望能够在每个文件进入时对其进行处理,而不是创建一个系列并在所有文件 block 都进入后运行。我仍在尝试将我的注意力集中在所有这些事件驱动的流程上,因此任何指针都很棒。

最佳答案

通常,您会使用队列来存储等待写入的数据,然后每当前一个追加完成时,您就会尝试写入下一个片段。像这样的事情:

var parts = [];
var inProgress = false;
function appendPart(data){
  parts.push(data);
  writeNextPart();
}

function writeNextPart(){
  if (inProgress || parts.length === 0) return;

  var data = parts.shift();
  inProgress = true;
  fs.appendFile(path + fileName, data.data, function (err) {
    inProgress = false;
    if (err) throw err;
    console.log(data.sequence + ' - The data was appended to file ' + fileName);

    writeNextPart();
  });
}

socket.on('sendChunk', function (data) {
  appendPart(data);
});

您需要扩展它以根据文件名保留 partsinProgress 的队列。为了简单起见,我的示例假设这些将保持不变。

关于node.js - 异步文件追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14917454/

相关文章:

javascript - 如何更改这些模块的这些 require 语句以改为使用 import 语句?

javascript - 具有完整路径的 Node 异步 mkdir

vue.js - 在 Pinia 中使用 Socket.io 时出现问题

javascript - 使用 Socket.IO,在发送 JavaScript 事件时防止客户端劫持 - 使用 SignalR?

javascript - 如何使用 ReactJS 将输入值保存到文本文件?

node.js - 如果失败X次,nodejs重试功能

javascript - 在 Eclipse 中重构 Javascript "extract method"导致崩溃

node.js - socket.io 实现一个简单的聊天

node.js - 获取http ://localhost/socket. io/?EIO=3&transport=polling&t=LjIvLGU 404(未找到)

javascript - 关于io.sockets.manager和Socket.io的join函数的各种问题