我正在使用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