2017-09-26 32 views
0

这是AWS lambda函数将调用API:的NodeJS API调用返回undefined以拉姆达功能

'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”。它不会在最后附加名称并返回正确的响应。

+0

console.log(event.name);这是否正确记录even.name? –

+0

@VijayanathViswanathan是 – RagingBull

+0

'console.log(event.name)'有效,但不是'$ {event.name}'?有些事不对。 – dashmug

回答

1

假设:

  • 您使用的λ-代理集成。
  • 你想传递的第一拉姆达接收的第二拉姆达的完全相同的有效载荷。*

你误会什么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中,您解析了字符串化的JSON event.body,然后获得原始有效负载。

如果您发送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

+0

它仍然不起作用 – RagingBull

+0

上述两个console.log语句都正常工作。我的意思是这样的:JSON.parse(event)是nit帮助我,因为它显示了一个错误,这意味着它已经是一个对象了。当我在lambda控制台中测试api时它给出了正确的响应,但是从浏览器或另一个lambda函数调用它时,它显示Hello world undefined。 – RagingBull

+0

我在通过的json中编辑了 – RagingBull

0

有类似的问题,并记录事件调试安慰。

添加的事件记录,

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

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

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

数据映射API网关与λ:

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

希望它能帮助。

+0

这不起作用 – RagingBull

+0

什么不起作用?控制台日志? – Kannaiyan

+0

上述两个console.log语句都正常工作。我的意思是这样的:JSON.parse(event)是nit帮助我,因为它显示一个错误,这意味着它已经是一个对象。当我在lambda控制台中测试api时,它会给出正确的响应,但是在从浏览器或另一个lambda函数调用它时,它会显示Hello world undefined。 – RagingBull