2017-09-26 82 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