从Lambda(JS; Web控制台)调用Rest API

时间:2019-02-12 11:25:26

标签: javascript api aws-lambda

_

我的挑战:

我想从我的 Lambda函数中访问第三方Rest API 。 (例如“ http://www.mocky.io/v2/5c62a4523000004a00019907”)。

这将提供一个JSON文件,然后将其用于数据提取

_

我的当前代码:

var http = require('http');

exports.handler = function(event, context, callback) {
    console.log('start request to Mocky');

    http.get('http://www.mocky.io/v2/5c62a4523000004a00019907', function(res) {
            console.log(res);

        })
        .on('error', function(e) {

            console.log("Got error: " + e.message);
        });
};

这不会引发错误,但似乎也没有提供JSON

_

我的公开问题:

1)如何提取JSON ,以便可以对其进行处理

2)以后,我可能还需要通过请求标头中的身份验证(承载者)进行发送。使用这种方法还能做到吗?

2 个答案:

答案 0 :(得分:1)

问题很可能是您的lambda函数在记录响应之前已退出。

我们一直使用Authorization标头来调用我们的lambda。是否可以使用一个调用第三方API的问题取决于他们,而不是您自己,所以请查看文档。

由于您的HTTP调用是异步执行的,因此lambda的执行会在解决该调用的同时继续执行。由于lambda中没有更多命令,因此它会在您的响应返回之前退出并可以记录。

编辑http.get模块很难与async / await完美地结合使用。由于这个原因,我通常使用superagentaxiosrequest甚至是node-fetch。我将在答案中使用request。如果必须使用本机模块,请参见EG this answer。否则,npm install request request-promise并在下面使用我的答案。

最近很多人用于这种呼叫的方案使用async/await,例如(需要Node 8 +):

var request = require('request-promise')

exports.handler = async function(event, context, callback) {
    console.log('start request to Mocky');
    try {
        const res = await request.get('http://www.mocky.io/v2/5c62a4523000004a00019907')
        console.log(res)
        callback(null, { statusCode: 200, body: JSON.stringify(res) })
    }
    catch(err) {
        console.error(err.message)
        callback('Got error ' + err.message)
    }
};

异步/等待版本更容易遵循IMO。

async函数中标有await的所有内容都必须先解析,然后才能继续执行。 try this one周围有很多关于此的文章。

答案 1 :(得分:0)

很多人都已经解决了同等的问题……请看thatthat