【问题标题】:Amazon Lambda - return docx file - Node.jsAmazon Lambda - 返回 docx 文件 - Node.js
【发布时间】:2019-04-17 06:54:56
【问题描述】:

我正在尝试将我的 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 网关,我将 LAMBDA_PROXY 与任何方法一起使用。模型/响应/映射都处于“默认”状态。但是,我得到的唯一响应是“内部服务器错误”。在 CloudWatch 日志中,我还看到“由于配置错误导致执行失败:无法对正文进行 base64 解码”。

我尝试复制 API 网关的各种解决方案和/或不同配置,但没有成功。可能我只是不了解亚马逊的 API Gateway,因此我不知道如何正确配置它。

也许日志说也可能是数据转换,但我尝试了toString("base64")之类的转换,也没有成功。

我应该怎么做才能使这个最小的解决方案起作用?谢谢!

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 aws-lambda docx


    【解决方案1】:

    如果您将回复更改为:

            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。如果需要,请重复此步骤以添加更多媒体类型。

    【讨论】:

    • 我正在尝试以二进制形式返回 S3 数据,并且一直在执行 body: file.Body.toString('base64'),没有有用的错误消息,只是内部服务器错误。我试过这个 Buffer.from(file.Body).toString('base64'),瞧,它就可以工作了......非常感谢。
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2013-01-15
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多