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));
});
}
});
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? –
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
Danke trotzdem –