2017-01-13 3 views
0

Mein Ziel ist es, alle Nachrichten von O365 mit MS Graph API und Node.js zu crawlen. Zuerst bekomme ich die Stammordner, dann mache ich eine Iteration über Stammordner und bekomme Nachrichten und wenn es die untergeordneten Ordner gibt, wird die childrenFoldersRequest-Funktion ausgeführt. Diese Funktion ruft sich selbst in Rekursion auf, wenn mehr untergeordnete Ordner vorhanden sind. Alles funktioniert gut, aber das Ergebnisobjekt, das ich im Speicher speichere und schreibe dieses Ergebnis in JSON-Datei. Dies kann in der Zukunft zu Leistungsproblemen führen. Wie kann ich alle Rekursionsantworten pipen und in die json-Ergebnisdatei streamen?Wie streamen Daten in Rekursionsfunktion in Node.js?

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

Und die childrenFoldersRequest Funktion:

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

    } 
}); 

Antwort

0

Sie eine funktionale Ansatz dieser 'Cache' haben kann. Initialisieren Sie Ihren Stream auf einer Schließung (auf der obersten zugänglichen Ebene) Dann fügen Sie bei jeder Iteration die nächste Information hinzu.

Vielleicht Hochland für Strom verwenden, es ist toll :)

Ich hoffe, ich half

+0

Sie für die Antwort danken. Außerdem muss ich neue Daten (Objekte, die ich bei jeder Iteration abrufe) in die Teile der ersten gestreamten Daten einfügen und keine Daten an das Ende der Datei anhängen. Wie könnte ich das erreichen? –

+0

hum ich sehe, vielleicht erstellen Sie einen Stream durch Iteration zusätzlich zu einem Hauptstrom, und rufen Sie den spezifischen Stream benötigt. Dafür müssen Sie eine Stream-Zeige-Liste erstellen, in der jeder Stream durch eine ID identifiziert wird (zum Beispiel der OrdnerName). Am Ende Ihrer rekursiven Funktion wird jeder "Mini-Stream" den Hauptstrom erzeugen ... Wenn Sie das nicht können, verwenden Sie einige Tools, die auf die Verarbeitung großer Datenmengen ausgerichtet sind ...? Entschuldigung, ich kann nicht mehr helfen :( – Mech45

+0

Danke trotzdem –

Verwandte Themen