2017-09-25 108 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), 
})