我正在使用SendGrid通过电子邮件接收文件。 SendGrid解析传入的电子邮件,并以多部分形式将文件发送到我设置的端点。如何在以多部分形式处理文件流之前等待字段
我不想让我的本地磁盘上的文件,所以我直接流到Amazon S3。这工作完美。
但是,在我可以流到S3之前,我需要掌握目标邮件地址,这样我才能制定出正确的s3文件夹。这是在表单帖子中的名为“to”的字段中发送的。不幸的是,这个字段有时会在文件到达后到达,因此我需要一种方法在我准备好接收流之前等待字段。
我以为我可以将onField封装在承诺中,并等待onFile中的to-field。但是这个概念似乎在字段到达文件后自动锁定它。
我是新来的摊位流和承诺。如果有人能告诉我如何做到这一点,我将非常感激。
这是不工作pseudoish代码:
function sendGridUpload(req, res, next) {
var busboy = new Busboy({ headers: req.headers });
var awaitEmailAddress = new Promise(function(resolve, reject) {
busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated) {
if(fieldname === 'to') {
resolve(val);
} else {
return;
}
});
});
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
function findInbox(emailAddress) {
console.log('Got email address: ' + emailAddress);
..find the inbox and generate an s3Key
return s3Key;
}
function saveFileStream(s3Key) {
..pipe the file directly to S3
}
awaitEmailAddress.then(findInbox)
.then(saveFileStream)
.catch(function(err) {
log.error(err)
});
});
req.pipe(busboy);
}
* facepalm *在重写的某个阶段,我设法重写onData事件。如果没有onData,则不会有数据流。重新启动onData事件后,它实际上似乎工作。但我会真正感兴趣的人更有知识的人的意见。这是一个好的解决方案吗? – Michael
另外..通过这个解决方案,我正在装载流中的内部缓冲区,直到我得到电子邮件地址并将流释放到S3。经过一些测试后,似乎是100k到几MB的情侣。内部流缓冲区能够增长多少而不会让我陷入困境? – Michael