2017-09-25 74 views
0

我在node.js中編寫了一個lambda,它將調用api(post)並返回結果體,代碼如下所示。使用apigateway調用外部api

const AWS = require('aws-sdk'); 
const request = require('request'); 

exports.handle = function(e, ctx, callback) { 
    var bodyDetails = { 
     uri: "myURL", 
     json: { 
      "requestChannel": "web1" }, 
     "method": "POST" 
    }; 

    callback = ctx.done; 
    var data = e.bodyJson || {}; 
    request(bodyDetails, function(error, response, body) { 
     if (!error && response.statusCode === 200) { 
      console.log(JSON.parse(JSON.stringify(body))); 
      jsonBody = JSON.parse(JSON.stringify(body)); 
      console.log(body + "\t from suvccess") // Print the json response 
      callback(null, jsonBody); // Return the JSON object back to our API call 
     } else { 
      callback(error); 
     } 
    }); 
} 

和我在我的lambda控制檯中測試相同。通過傳遞一個空白的json {},我得到正確的迴應。

現在我的下一個計劃是將這件作品與API網關進行整合。所以我在我的apigateway中爲此創建了一個API,並且創建了一個名爲home的資源。在家中,我創建了一個GET方法。與下面的細節。

Integration type: Lambda Function 
Use Lambda Proxy integration : checked 
Lambda Region: us-east-1 
Lambda Function: myWorkingLambdaName 

當我測試了這個使用apgateway給出的test選項。我得到的迴應是

Request: /home 
Status: 502 
Latency: 2942 ms 
Response Body 
{ 
    "message": "Internal server error" 
} 

,當我看到我的控制檯我看到印刷的成功塊的值,但狀態代碼是502,這是非常混亂的,請讓我知道我要去哪裏錯了,以及如何我能解決這個問題嗎?

感謝

回答

3

API網關預計以下屬性從您的LAMBDA返回:

{ 
    "isBase64Encoded": true|false, 
    "statusCode": httpStatusCode, 
    "headers": { "headerName": "headerValue", ... }, 
    "body": "..." 
} 

所以,相反的callback(null, jsonBody),你應該叫callback這樣的:

callback(null, { 
    isBase64Encoded: false, 
    statusCode: 200, 
    headers: { 
     "Access-Control-Allow-Origin" : "*", 
    }, 
    body: JSON.stringify(jsonBody), 
})