在AWS Lambda上以string的身体parsing多部分/表单数据

我很高兴看到 AWS现在支持AWS Lambda上的多部分/表单数据,但现在原始数据在我的lambda函数中,我该如何处理呢?

我看到multiparty是一个很好的多部分库的节点多部分处理,但它的构造函数期待一个请求,而不是一个原始的string。

我在Lambda函数(正文映射模板应用之后)上接收到的input消息是:

{ "rawBody": "--ce0741b2-93d4-4865-a7d6-20ca51fe2689\r\nContent-Disposition: form-data; name=\"Content-Type\"\r\n\r\nmultipart/mixed; boundary=\"------------020601070403020003080006\"\r\n--ce0741b2-93d4-4865-a7d6-20ca51fe2689\r\nContent-Disposition: form-data; name=\"Date\"\r\n\r\nFri, 26 Apr 2013 11:50:29 -0700\r\n--ce0741b2-93d4-4865-a7d6-20ca51fe2689\r\nContent-Disposition: form-data; name=\"From\"\r\n\r\nBob <bob@mg.mydomain.io>\r\n--ce0741b2-93d4-4865-a7d6-20ca51fe2689\r\nContent-Disposition: form-data; name=\"In-Reply-To\"\r... 

等等和一些文件数据。

我正在使用的正文映射模板是

 { "rawBody" : "$util.escapeJavaScript($input.body).replaceAll("\\'", "'")" } 

我怎样才能parsing这些数据以获取发布到我的Lambda函数的字段和文件?

这对我有用 – 使用busboy

信用欠Parse来自Node.js中的Buffer的multipart / form-data ,我从这里拷贝了大部分内容。

 const busboy = require('busboy'); const headers = { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS, POST', 'Access-Control-Allow-Headers': 'Content-Type' }; function handler(event, context) { var contentType = event.headers['Content-Type'] || event.headers['content-type']; var bb = new busboy({ headers: { 'content-type': contentType }}); bb.on('file', function (fieldname, file, filename, encoding, mimetype) { console.log('File [%s]: filename=%j; encoding=%j; mimetype=%j', fieldname, filename, encoding, mimetype); file .on('data', data => console.log('File [%s] got %d bytes', fieldname, data.length)) .on('end', () => console.log('File [%s] Finished', fieldname)); }) .on('field', (fieldname, val) =>console.log('Field [%s]: value: %j', fieldname, val)) .on('finish', () => { console.log('Done parsing form!'); context.succeed({ statusCode: 200, body: 'all done', headers }); }) .on('error', err => { console.log('failed', err); context.fail({ statusCode: 500, body: err, headers }); }); bb.end(event.body); } module.exports = { handler }; 

基于@AvnerSo:回答,下面是一个函数的简单版本,它将请求主体和头部作为参数,并返回包含表单字段和值的对象的承诺(跳过文件):

 const parseForm = (body, headers) => new Promise((resolve, reject) => { const contentType = headers['Content-Type'] || headers['content-type']; const bb = new busboy({ headers: { 'content-type': contentType }}); var data = {}; bb.on('field', (fieldname, val) => { data[fieldname] = val; }).on('finish', () => { resolve(data); }).on('error', err => { reject(err); }); bb.end(body); });