我正在使用 IMAP 库和 javascript 来获取电子邮件。
我的计划如下:
我现在遇到的问题
目前,我向特定电子邮件发送了两封电子邮件,其中包含相同的 pdf 和相同的主题。
我尝试了什么
代码
fetch.on('message', (msg) => {
msg.on('body', (stream) => {
simpleParser(stream, async (err, parsed) => {
if (err) throw err;
if (parsed.attachments) {
//defined already as an empty array
attachmentPromises = parsed.attachments.map(async (attachment, index) => {
return new Promise((resolve, reject) => {
if (attachment.contentType === 'application/pdf') {
// Process the pdf here...
resolve({
object details with key value pairs.
});
}
else {
resolve(null);
}
});
});
//We wait for the promises to resolve
Promise.all(attachmentPromises).then(attachments => {
//we get only the values that are not null
const validAttachments = attachments.filter(attachment => attachment !== null);
allAttachmentsData = allAttachmentsData.concat(validAttachments);
});
}
});
});
});
获取事件
fetch.once('error', (err) => {
console.log('Fetch error: ' + err);
});
fetch.once('end', function () {
//allAttachmentsData is empty
return res.status(200).json(allAttachmentsData);
})
您的方法建议您在事件侦听器内使用异步操作(simpleParser
和承诺处理)来获取消息。但是,您似乎无法确保在触发提取的结束事件之前完成所有异步操作。这可能会导致计时问题,即在所有承诺解决之前触发结束事件。
Promise.all
函数用于处理 Promise 数组。但是,在您的代码中,使用
Promise.all
处理这些承诺是在 body 事件内完成的,这可能不会在 fetch 操作的结束事件之前解决。
const attachmentPromises = [];
fetch.on('message', (msg) => {
msg.on('body', (stream) => {
const promise = new Promise((resolve, reject) => {
simpleParser(stream, (err, parsed) => {
if (err) return reject(err);
if (parsed.attachments) {
const promises = parsed.attachments.map((attachment) => {
if (attachment.contentType === 'application/pdf') {
// Process the pdf here...
return {
// Object details with key-value pairs
};
} else {
return null;
}
});
resolve(promises.filter(att => att !== null));
} else {
resolve([]);
}
});
});
attachmentPromises.push(promise);
});
});
fetch.once('error', (err) => {
console.log('Fetch error: ' + err);
res.status(500).json({ error: 'Fetch error' });
});
fetch.once('end', () => {
Promise.all(attachmentPromises).then(results => {
const attachments = results.flat();
res.status(200).json(attachments);
}).catch(err => {
console.log('Error resolving promises:', err);
res.status(500).json({ error: 'Error processing emails' });
});
});