如何在 Node.js 中的递归函数中流式传输数据



我的目标是使用 MS Graph API 和 Node.js 抓取来自 O365 的所有消息。首先,我正在获取根文件夹,然后我对根文件夹进行迭代并获取消息,如果有子文件夹,则执行 childrenFolderRequest 函数。如果有更多的子文件夹,此函数在递归中调用它 self。一切正常,但我将结果对象存储在内存中并将此结果写入 json 文件。将来可能会导致性能问题。如何通过管道传输所有递归响应并将其流式传输到结果 json 文件?

function getMessages(accessToken, callback) {
  https.get(options, function (response) {
    var body = '';
    response.on('data', function (d) {
      body += d;
    });
    response.on('end', function () {
    var error;
    if (response.statusCode === 200) {
      var mailFolders = JSON.parse(body).value,
        resultObject = {},
        resultFolder = {};
      callback(null, JSON.parse(body));
      // Iterate through mail folders and get messages for each folder
      asyncIterator(mailFolders, function (path, next) {
        var config = {
          skip: 0
        };
        // Get messages for folder
        messageRequest(accessToken, path.id, config.skip, resultFolder, function (messages) {
          resultObject[path.displayName] = messages;
          // If folder has child folders
          if (path.childFolderCount) {
            resultObject[path.displayName].innerFolders = {};
            // Get children folders
            childrenFoldersRequest(accessToken, path.id, resultObject[path.displayName].innerFolders, function (childFolders) {
            next();
          });
        } else {
          next();
        }
      });
    }, function () {
      callback(null, resultObject);
    });
  }
});

而子文件夹请求功能:

function childrenFoldersRequest(accessToken, folderId, resultObject, callback) {
  https.get(options, function (response) {
    var body = '';
    response.on('data', function (d) {
      body += d;
    });
    response.on('end', function () {
      var error;
      if (response.statusCode === 200) {
        // Iterate through child folders
        asyncIterator(JSON.parse(body).value, function (path, next) {
          resultObject[path.displayName] = {};
          var resultFolder = {};
          var config = {
            skip: 0
          };
          // Get messages from folder
          messageRequest(accessToken, path.id, config.skip, resultFolder, function (messages) {
          resultObject[path.displayName].messages = messages;
          // If folder has child folders
          if (path.childFolderCount) {
            resultObject[path.displayName].innerFolders = {};
            // make recursive function call if we have child folders 
            childrenFoldersRequest(accessToken, path.id, resultObject[path.displayName].innerFolders, function (childFolders) {
            next();
          });
        } else {
          next();
        }
      });
    }, function () {
      callback(JSON.parse(body));
    });
  }
});

您可能对此有一个"缓存"功能方法。在闭包上初始化流(在顶部可访问级别)然后,在每次迭代时,您将在其上添加下一个信息。

也许使用高地作为你的溪流,这是很棒的:)

我希望我有所帮助

最新更新