首页 文章

使用apigateway呼叫外部api

提问于
浏览
0

我正在node.js中编写一个lambda,它将调用api(post)并返回生成的主体,代码如下所示 .

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 Gateway集成 . 所以我在 apigateway 中为此创建了一个api,并且在那里,我创建了一个名为 home 的资源 . 在家里,我创建了一个 GET 方法 . 以下详细信息 .

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

当我使用apigateway给出的 test 选项进行测试时 . 我得到了回复

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

当我看到我的控制台时,我看到打印成功块的值,但状态代码为502.这非常令人困惑,请让我知道我哪里出错了,我该如何解决这个问题 .

谢谢

1 回答

  • 3

    API Gateway期望从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),
    })
    

相关问题