Nodejs API调用将未定义返回给lambda函数

Posted

技术标签:

【中文标题】Nodejs API调用将未定义返回给lambda函数【英文标题】:Nodejs API call returning undefined to lambda function 【发布时间】:2018-03-07 15:00:30 【问题描述】:

这是将调用 api 的 aws lambda 函数:

'use strict';

var request = require("request")

exports.handler = function (event, context,callback) 



let url = "https://3sawt0jvzf.execute-api.us-east-1.amazonaws.com/prod/test"

request(
    url: url,
    method: "POST",
    json: event,

, function (error, response, body) 
    if (!error && response.statusCode === 200) 
        callback(null,  "isBase64Encoded": true|false,
                          "statusCode": "200",
                          "headers":  "headerName": "headerValue",
                          "body": body);
    
    else 

        console.log("error: " + error)
        console.log("response.statusCode: " + response.statusCode)
        console.log("response.statusText: " + response.statusText)
    
)
;

这是编写为 aws lambda 函数的 api:

'use strict';


exports.handler = function(event, context, callback) 
console.log(event.name);
callback(null,  "isBase64Encoded": true|false,
                 "statusCode": "200",
                 "headers":  "headerName": "headerValue",
                 "body": `Hello World $event.name`);  // SUCCESS with message
;

当我尝试从 lambda 函数调用 api 时,它只会返回“Hello World undefined”。它没有在末尾附加名称并返回正确的响应。

【问题讨论】:

console.log(event.name);这个日志记录 even.name 正确吗? @VijayanathViswanathan 是的 console.log(event.name) 有效但 $event.name 无效?有点不对劲。 那么模板字符串肯定有问题。为了证明你可以尝试附加字符串的旧方法,'Hello World' + event.name 添加了答案。我相信你的节点版本低于 v4.0.0 【参考方案1】:

我遇到了一些非常相似的问题。当试图在event.body 上调用JSON.parse() 时,我收到一个错误,因为事件已经是我试图POST 的对象。我实际上并没有将我的数据库链接到我的前端,但是在从 Lambda 和 API Gateway 进行测试时我遇到了这个错误。

我现在如何才能从我的请求中读取对象的示例:

"use strict";
const AWS = require("aws-sdk");

exports.handler = async (event, context) => 

const documentClient = new AWS.DynamoDB.DocumentClient();

let responseBody; 
let statusCode;

console.log(event.id) // I have access to dot notation straight from the event

const id, item, quantity, orderTotal, userId = event;

【讨论】:

【参考方案2】:

假设:

您正在使用 Lambda 代理集成。 您希望将与第一个 Lambda 接收到的完全相同的有效负载传递给第二个 Lambda。*

您误解了event 是什么。这不是您通过 HTTP 请求发送的 JSON 负载。

通过 API 网关的 HTTP 请求被转换为类似于此的 event 对象:


    "resource": "Resource path",
    "path": "Path parameter",
    "httpMethod": "Incoming request's method name"
    "headers": Incoming request headers
    "queryStringParameters": query string parameters 
    "pathParameters":  path parameters
    "stageVariables": Applicable stage variables
    "requestContext": Request context, including authorizer-returned key-value pairs
    "body": "A JSON string of the request payload."
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode"

如您所见,可以在event.body 中以字符串形式访问 JSON 有效负载。

如果要将传递相同的有效负载发送到第二个 Lambda,则必须先对其进行解析。

const body = JSON.parse(event.body)

然后,发送body 而不是event

然后,在您的第二个 Lambda 中,您在 event.body 中解析字符串化的 JSON,然后您获取原始有效负载。

如果您在该原始有效负载中发送了name,则可以从JSON.parse(event.body).name 获取它。

参考:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

【讨论】:

上述两个 console.log 语句都工作正常。我的意思是:JSON.parse(event) 对我没有帮助,因为它显示一个错误,这意味着它已经是一个对象。当我在 lambda 控制台中测试 api 时,它会给出正确的响应,但是在从浏览器或其他 lambda 函数调用它时,它显示 Hello world undefined。 我在正在传递的 json 中进行了编辑【参考方案3】:

遇到了类似的问题,并通过将事件记录到控制台进行了调试。

添加事件日志,

console.log(JSON.stringify(event));

评估如何在您的 API-Gateway 到 Lambda 集成中完成映射,并查看 post 参数存在的位置。

如果帖子值不存在,请修复集成,直到您获得事件中的帖子值。

到 Lambda 的数据映射 API-网关:

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

希望对你有帮助。

【讨论】:

上述两个 console.log 语句都工作正常。我的意思是:JSON.parse(event) 对我没有帮助,因为它显示一个错误,这意味着它已经是一个对象。当我在 lambda 控制台中测试 api 时,它会给出正确的响应,但是在从浏览器或其他 lambda 函数调用它时,它显示 Hello world undefined。 尝试记录事件并附加对问题的响应 在测试时,我的输入(即事件)是这个 "name" :"basant",这与给出 console.log 时的输出相同。但是,当我尝试从另一个 lambda 函数或从浏览器调用此 api 时,它会显示 Hello world undefined.The name is not being pass for some reason 我在正在传递的 json 中进行了编辑 复制并粘贴我突出显示并从您的 lambda 调用的行,而不是通过测试并粘贴响应

以上是关于Nodejs API调用将未定义返回给lambda函数的主要内容,如果未能解决你的问题,请参考以下文章

如何从 nodejs 中的另一个 lambda 调用 graphql lambda?

NodeJS - FormData将未定义的值发送到服务器

在 Elastic Beanstalk 和 AWS Lambda 上更新 nodejs API

Node.js Lambda 函数从 REST 调用将“响应无效”返回给 Alexa 服务模拟器

AWS Lambda NodeJS导入返回空模块,但仅在AWS中

闲置时,带有 Lambda 的 API 网关在第一次调用时返回 404?