Nodejs API调用将undefined返回给lambda函数

时间:2017-09-26 11:41:26

标签: node.js amazon-web-services aws-lambda aws-api-gateway

这是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
};

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

message

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

3 个答案:

答案 0 :(得分:3)

假设:

  • 您正在使用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"
}

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

如果要将相同的有效负载发送到第二个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

答案 1 :(得分:1)

遇到类似问题并使用记录事件调试到控制台。

添加事件记录,

  

的console.log(JSON.stringify(事件));

评估如何在API网关中进行映射以进行Lambda集成,并查看post参数的存在位置。

如果帖子值不存在,则在您获得活动中的帖子值之前修复整合。

数据映射API-Lambda网关:

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

希望它有所帮助。

答案 2 :(得分:0)

我有一些非常相似的问题。尝试在JSON.parse()上调用event.body时,出现错误,因为事件已经是我要尝试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;