Node.js AWS API网关JSON输入意外结束

Node.js AWS API网关JSON输入意外结束,node.js,amazon-web-services,aws-api-gateway,Node.js,Amazon Web Services,Aws Api Gateway,我们有一个公司API,我们目前正在切换到AWS API网关。API网关中的端点使用Node.js Lambda函数访问现有的内部端点,使用AWS进行速率限制和身份验证。我的第一个端点工作得很好,但我的第二个端点给了我一个空白响应,在CloudWatch中我看到以下错误: 2017-10-04T03:24:46.957Z 925a40ba-a8b3-11e7-be24-8d954fcaf057 SyntaxError: Unexpected end of JSON input at Object

我们有一个公司API,我们目前正在切换到AWS API网关。API网关中的端点使用Node.js Lambda函数访问现有的内部端点,使用AWS进行速率限制和身份验证。我的第一个端点工作得很好,但我的第二个端点给了我一个空白响应,在CloudWatch中我看到以下错误:

2017-10-04T03:24:46.957Z 925a40ba-a8b3-11e7-be24-8d954fcaf057 
SyntaxError: Unexpected end of JSON input
at Object.parse (native)
at IncomingMessage.<anonymous> (/var/task/index.js:67:37)
at emitNone (events.js:91:20)
at IncomingMessage.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)
JSON是有效的,所以我不确定为什么AWS返回了一个带有意外结尾的错误。我尝试将结果更改为仅一个JSON项,而不是数组,但在CloudWatch中仍然得到相同的错误。我甚至不确定从哪里开始寻找,这是否可能是Lambda函数的问题,或者它是否与我们的代码库实际返回的内容有关

为清晰起见进行编辑

请求使用Lambda函数集成,但不使用Lambda代理集成。完整的lambda可以在

我们使用回调函数处理Lambda中的分块数据:

callback = function(response) {
    var responseString = '';

    // Another chunk of data has been recieved, so append it to `str`
    response.on('data', function (chunk) {
        responseString += chunk;
    });

    // The whole response has been received
    response.on('end', function () {
        console.log(responseString);
        // Parse response to json
        var jsonResponse = JSON.parse(responseString);

        var output = {
            status: response.statusCode,
            bodyJson: jsonResponse,
            headers: response.headers
};

问题出在我们的应用程序端。API网关将发送到端点的所有请求的内容类型头设置为application/json,当内容类型设置为json时,我们的应用程序将清除所有查询字符串参数,以利于提取主体


此终结点有一些必需的查询字符串参数被删除,因此它失败了,并且它返回的错误消息没有正确格式化为JSON,因此节点无法对其进行解析。

值得一提的是,我最近遇到了此错误,30分钟后它就消失了。API网关可能有问题?

如何配置API网关?在“集成请求”部分下,您是否选择了“Lambda函数”和“使用Lambda代理集成”,这样它就可以直接传递所有信息?
console.log
处理程序中的
事件,然后检查CloudWatch日志。用您看到的内容更新您的问题。听起来您正在使用http/https从后端获取响应,并且您捕获响应的方式可能存在问题,导致您只解析第一块数据,而不是等待整个响应,因此,代码失败的方式与响应块到达的大小或时间有关
console.log(foo)
紧跟在您的前面
JSON.parse(foo)
?i、 我们不使用Lambda代理集成,我已经用Lambda函数的要点更新了这个问题。紧接着JSON.parse之前的响应的console.log在CloudWatch中只有一个空字符串。我想我发现了问题,查询字符串没有正确地发送到我们的直接端点,这导致返回的结果格式不正确(需要查询字符串参数)
callback = function(response) {
    var responseString = '';

    // Another chunk of data has been recieved, so append it to `str`
    response.on('data', function (chunk) {
        responseString += chunk;
    });

    // The whole response has been received
    response.on('end', function () {
        console.log(responseString);
        // Parse response to json
        var jsonResponse = JSON.parse(responseString);

        var output = {
            status: response.statusCode,
            bodyJson: jsonResponse,
            headers: response.headers
};