Javascript 从Lambda调用restapi(JS;Web控制台)

Javascript 从Lambda调用restapi(JS;Web控制台),javascript,api,aws-lambda,Javascript,Api,Aws Lambda,_ 我的挑战: 我想从我的Lambda函数中访问第三方Rest API。(例如“”) 这将返回一个JSON文件,然后我将使用该文件进行数据提取 _ 我当前的代码: 这不会抛出错误,但似乎也不会返回JSON _ 我的开放性问题: 1) 我如何提取JSON以便处理它 2) 将来,我可能还需要在请求头中发送一个身份验证。使用此方法也可以吗?问题可能是lambda函数在记录响应之前退出 我们一直使用Authorization头来调用我们的lambda。是否可以使用一个API调用第三方API的问题取决于他

_

我的挑战: 我想从我的Lambda函数中访问第三方Rest API。(例如“”)

这将返回一个JSON文件,然后我将使用该文件进行数据提取

_

我当前的代码: 这不会抛出错误,但似乎也不会返回JSON

_

我的开放性问题: 1) 我如何提取JSON以便处理它


2) 将来,我可能还需要在请求头中发送一个身份验证。使用此方法也可以吗?

问题可能是lambda函数在记录响应之前退出

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

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

EDIT:http.get模块很难与async/await一起干净地使用。出于这个原因,我通常使用
superagent
axios
、或
request
,甚至
node fetch
。我将在回答中使用
请求
。如果必须使用本机模块,请参阅。否则,
npm安装请求promise
并使用下面的答案

现在许多人用于此类呼叫的方案使用
async/await
,例如(需要节点8+):

异步/等待版本更易于遵循


async
函数中标记为
wait
with的所有内容都必须在继续执行之前解决。有很多关于这方面的文章,。

有很多人已经解决了一个同样的问题。。。看看
或者

亲爱的马特,非常感谢你的帮助!对于第一个示例:首先,流程在完成请求之前退出。然后我添加了“async”,它运行成功。如果我真的从API接收到任何输入,我会在哪里放置一个“console.log”语句来跟踪?对于第二个示例:我首先收到catch语句的错误。然后,我在try语句之后添加了另一个“}”,以完成此操作。然而,当我尝试运行该程序时,我得到一个错误,它说在调用两个示例中的回调之前,它找不到“promisify”模块,但控制台日志在流中,这应该可以工作。您需要节点8+才能使用
promisify
,而节点7.6或更高版本才能使用
async/await
。Lambda现在接受8.10版本,所以如果可以,请升级。我已经编辑了我的答案以包含这些附加信息。我在Node.js 8.10上,仍然得到一个错误:{“errorMessage”:“找不到模块‘promisify’”,“errorType”:“error”,“stackTrace”:[“Function.module.\u load(module.js:474:25)”,“module.require(module.js:596:17)”,“require(internal/module.js:11:18)”,“Object.(/var/task/index.js:2:17)”,“Module.u compile(Module.js:652:30)”,“Object.Module.\u extensions..js(Module.js:663:10)”,“Module.load(Module.js:565:32)”,“tryModuleLoad(Module.js:505:12)”,“Function.Module.\u load(Module.js:497:3)”亲爱的马特,再次感谢您的帮助。我已更改为Typicode API(“),只是为了确保API端没有故障。我已将“http”部分更改为“https”。但是,我现在让代码正常工作,但得到了“undefined”的错误响应“.有什么想法吗?@Geole我忘了本机
http.get
返回一个流。我从不在实践中使用它,因为语法更复杂。我已经简化了我的回答,以展示如何使用
请求承诺
提出此请求。亲爱的Ore,感谢您的回答。我更少地与AysnChrous调用斗争,更多地是与实际连接到API并检索数据的能力。哦,我一定忽略了这一点。但是,我强烈建议您听听Matt Morgen的话,特别是关于无服务器框架的话,它消除了很多困难。
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);
        });
};
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)
    }
};