繁体   English   中英

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

[英]Nodejs API call returning undefined to lambda function

这是将调用 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”。 它不会在末尾附加名称并返回正确的响应。

假设:

  • 您正在使用 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.stringify(event));

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

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

数据映射 API 网关到 Lambda:

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

希望它有帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM