【问题标题】:Nodejs API call returning undefined to lambda functionNodejs API调用将未定义返回给lambda函数
【发布时间】: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

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


【解决方案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 调用的行,而不是通过测试并粘贴响应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多