我正在尝试将Node.js应用程序从 Google Cloud Functions 迁移到 Amazon Lambda 。应用程序从Amazon S3加载docx文件,对其进行处理并返回该docx文件。但是我卡在文件返回的过程中。在Google Cloud Platform中,我可以这样做:
module.exports = function(customENV){ return function(req, res) { new AWS.S3().getObject({ Bucket: aws_bucket, Key: aws_file }, function(err, data) { if(!err) { res.set('Access-Control-Allow-Origin', "*"); res.set('Access-Control-Allow-Methods', 'GET, POST'); res.set('Content-Disposition', `inline; filename="rename.docx"`); res.type('docx'); res.status(200); res.end(data.Body, 'binary'); } }); }};
在Amazon Lambda中,我复制了这样的解决方案:
exports.handler = function(event, context, callback) { new AWS.S3().getObject({ Bucket: aws_bucket, Key: aws_file }, function(err, data) { if(!err) { var response = { statusCode: 200, headers: { 'Access-Control-Allow-Origin': "*", 'Access-Control-Allow-Methods': 'GET, POST', 'Content-type' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'Content-Disposition': 'inline; filename="rename.docx"' }, isBase64Encoded: true, body: data.Body, }; callback(null, response); } }); };
作为API网关,我使用ANY方法使用LAMBDA_PROXY。模型/响应/映射都处于“默认”状态。但是,我得到的唯一响应是“内部服务器错误”。在CloudWatch日志中,我还看到“由于配置错误,执行失败:无法对主机进行base64解码”。
我尝试复制API网关的各种解决方案和/或不同配置,但是没有运气。可能我只是不了解Amazon的API网关,因此我不知道如何正确配置它。
也许如日志所述,这也可能是数据转换,但是我尝试了像 toString(“ base64”)这样的转换,也没有成功。
任何想法如何使这个最小的解决方案起作用?谢谢!
答案 0 :(得分:2)
如果您将响应更改为:
var response = {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': "*",
'Access-Control-Allow-Methods': 'GET, POST',
'Content-type' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'Content-Disposition': 'inline; filename="rename.docx"'
},
isBase64Encoded: true,
body: Buffer.from(data.Body).toString('base64'),
};
这应该可以克服您的Unable to base64 decode the body
错误(如果没有,请记录response
对象以确认您的lambda成功返回并且主体是 base64字符串)。
但是,您还需要将二进制媒体类型添加到网关部署中,否则当您发出请求时,响应将是base64字符串,而不是二进制。涉及到一些点击(full documentation):
- 在主导航面板中选择的API下,选择“设置”。
- 在“设置”窗格中的“二进制媒体类型”部分中,选择“添加二进制媒体类型”。
- 在输入文本字段中输入所需的媒体类型,例如image / png。如果需要,请重复此步骤以添加更多媒体类型。