node.js - lambda 边缘 "The Lambda function returned invalid json: The json output is not parsable."

标签 node.js amazon-web-services aws-lambda

我正在尝试使用nodeJS本地读取一个JS文件(压缩,以便它可以适应lambda边缘限制)并在响应中返回它,但我从标题中得到错误。这是为什么? aws Edge 是否禁止 gzip 正文?

 'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;

    var noCacheHeaders = {
        'cache-control': [{
            key: 'Cache-Control',
            value: 'no-cache'
        }],
        'pragma': [{
            key: 'Pragma',
            value: 'no-cache'
        }],
        'content-type': [{
            key: 'Content-Type',
            value: 'text/html'
        }]
    };
    if (request.uri.startsWith('/js/') === true) {
        console.log("js path");
        const fs = require('fs');
        fs.readFile('js.gz', function(err, data) {
            if (err) {
                console.log(err);
                // prevent caching on errors
                const response = {
                    status: '500',
                    statusDescription: 'OK',
                    headers: noCacheHeaders,
                    body: "",
                };
                callback(null, response);
            } else {
                const response = {
                    status: '200',
                    statusDescription: 'OK',
                    headers: noCacheHeaders,//cachedHeaders,
                    body: data.toString(),
                };
                callback(null, response);
            }
        });
        return;
    }

        callback(null, request);
        return;

};

最佳答案

Gzip 压缩的内容不是字符数据——它是二进制数据——这意味着它不能直接序列化为 JSON。由于 response 对象通过 callback() 自动序列化为 JSON,因此数据需要进行 Base64 编码(因为任何任意二进制数据的 Base64 总是会产生干净的字符数据) ),然后 CloudFront 需要知道您做了什么,以便它可以将其解码回二进制并将其交给浏览器。

原则上,您需要类似这样的东西:

      const response = {
        status: '200',
        statusDescription: 'OK',
        headers: noCacheHeaders, //cachedHeaders,
        body: data.toString('base64'), // assuming data is a buffer here (?), encode it
        bodyEncoding: 'base64',        // tell CloudFront it's base64; CloudFront will decode back to binary
      };

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-generating-http-responses.html#lambda-generating-http-responses-object

关于node.js - lambda 边缘 "The Lambda function returned invalid json: The json output is not parsable.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48198789/

相关文章:

python - AWS/Python Lambda 函数检查是否存在查询字符串

typescript - 在 AWS Lambda 和 AWS Cloudwatch 中使用 Typescript 源映射

node.js - 如何在创建期间访问 MongoDB 对象 ID?

javascript - Sequelize保存在多个表中

amazon-web-services - 从 AWS SES 发送电子邮件时出现凭据错误

amazon-web-services - 从 EC2 实例使用 AWS CLI,无需 Internet 访问

amazon-web-services - 将特定 AWS API Gateway 阶段连接到 CloudFormation 模板中的特定 Lambda 别名

javascript - 当我实例化一个新类时使用 .call

javascript - 从 ytdl-core 获取视频标题

file - 在同一区域将大文件从 S3 下载到 EC2 的最快方法是什么?