首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Lambda edge“Lambda函数返回无效的json: json输出不可解析。”

Lambda edge“Lambda函数返回无效的json: json输出不可解析。”
EN

Stack Overflow用户
提问于 2018-01-11 01:59:50
回答 1查看 7.5K关注 0票数 4

我尝试使用nodeJS在本地读取一个JS文件(压缩后的文件,这样它就可以满足λ边缘限制),并在响应中返回它,但我从title中得到了错误。为什么会这样呢?aws edge是否禁止gzip body?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 '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;

};
EN

回答 1

Stack Overflow用户

发布于 2018-01-11 19:47:00

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

原则上,你需要更多这样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48198789

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文