我的目标是使用 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));
});
}
});
您可能对此有一个"缓存"功能方法。在闭包上初始化流(在顶部可访问级别)然后,在每次迭代时,您将在其上添加下一个信息。
也许使用高地作为你的溪流,这是很棒的:)
我希望我有所帮助