gpt4 book ai didi

node.js - 如何在 AWS Lambda Node.js 运行时异步发出 HTTP 请求

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:49 24 4
gpt4 key购买 nike

我创建了一个 API 端点,当使用 HTTP Post 请求成功访问该端点时,该端点会返回一个整数。我希望 AWS CloudWatch 计划进程每分钟运行一个 AWS Lambda 函数来检查 API 终端 Node ,以确保该值不为零。我已经设置了计划的 AWS CloudWatch 进程和 AWS Lambda 函数,其中运行时是 Node.js 10。但是,当我查看 AWS CloudWatch 组的流日志时,日志似乎没有顺序。我怀疑这是因为对 API 端点的 HTTP 请求是异步运行的,但我最终不知道。将此 HTTP 请求的值记录到 API 端点所需的时间似乎比处理请求的实际时间长得多。

这是每分钟运行的 Node.js lambda 函数:

exports.handler = async (event) => {

var datetime = new Date();

var request = require("request");

var options = {
method: 'POST',
url: 'https://website.com/api/getDataPoints',
headers:
{
'cache-control': 'no-cache',
'content-type': 'text/plain'
},
body: '{"token" : "yT7g8urUFmEZwQrJNHgQGRDA9zScpNzPM3rb"}'
};

await request(options, function (error, response, body) {

if (error)
{
throw new Error(error);
// Email and SMS message that this is having an error
}

if (body == 0)
{
// Email and SMS message that this is having an error
// Restart EC2 server
}

console.log(datetime.toString() + " - " + body + " Data Points!");

});
};

这里是 AWS CloudWatch 日志,在这里可以更轻松地看到记录 HTTP 请求响应的延迟:

AWS CloudWatch log

任何有关这种感知日志延迟原因的见解或有关如何以更有效的方式实现类似结果的建议将不胜感激!谢谢!

最佳答案

下面是发生的情况:await 立即返回,因为请求函数不返回 Promise,因此回调在 lambda 函数退出后发生。查看日志的延迟时间如此之长的原因是,当您的 lambda 函数空闲时(意味着所有处理函数都已返回,即使有回调等待),AWS 也可以暂停任何正在执行的代码,直到再次调用该函数。因此,在您的情况下,当下一分钟到来并且再次调用 lambda 函数时,AWS 将取消暂停任何正在执行的代码,并且回调会立即开始,您会看到上一次调用的日志。

为了解决这个问题,您需要确保处理程序函数在所有工作完成之前不会返回(我认为您打算对等待执行此操作)。因此,将请求调用包装在一个函数中,该函数返回一个在回调中解析的 promise ,并在包装​​函数上使用await。

function doRequest() {
return new Promise((resolve, reject) => {
request(options, function (error, response, body) {

if (error){
throw new Error(error);
// Email and SMS message that this is having an error
}

if (body == 0){
// Email and SMS message that this is having an error
// Restart EC2 server
}

console.log(datetime.toString() + " - " + body + " Data Points!");
resolve();
});
});
}

await doRequest();

关于node.js - 如何在 AWS Lambda Node.js 运行时异步发出 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57261432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com