node.js - 我如何在 AWS Lambda 中返回状态代码和响应

标签 node.js https aws-lambda

我正在编写一个 Lambda 函数,该函数将用于向 API 发送测试消息。如果出现错误,我将需要它来运行某些功能(例如通过 AWS 消息通知我)。我想通过状态代码进行简单的测试。例如,如果我得到 2XX,则什么都不做,如果我得到 4XX 或 5XX,请通知我,以便我研究问题。在测试环境中,我将正文作为 XML 字符串作为 JSON 对象中的值传递。

示例 Lambda 测试事件

{
 "data": "<xml stuff, credentials, etc"
}

这是我的功能

exports.handler = async (event, context) => {

const https = require('https');

const options = {
  hostname: 'https://mythingy.com',
  port: 443,
  path: '/target',
  method: 'POST',
  headers: {'Content-Type': 'application/xml'}
};

const req = https.request(options, res => {
  console.log(`statusCode: ${res.statusCode}`);

  res.on('data', d => {
    process.stdout.write(d);
  });
});

req.on('error', error => {
  console.error(error);
});

req.write(event.data);
req.end();

};

我在 Lambda 中使用 Node 10.x,并且从 lambda 收到“结果成功”消息,但没有记录响应状态代码。我已经通过多种方式做到了这一点,并且过去很容易从 Node fetch、ajax、http 请求中提取 statsCodes。我知道这可能与 Lambda 的环境和 promise 有关。谁能帮我弄清楚如何在 Lambda 中记录统计代码?

最佳答案

您看不到它打印出来,因为您的函数是异步的,并且 https.request 使用回调方法,该方法将由 Node.js 工作线程异步运行。事实证明,该函数在有机会执行回调内的代码之前就已到达结尾。是的,你是对的,这是由于 Lambda 函数的工作方式造成的,因为它们是短暂的(上下文可以重用,但这是另一个问题的故事),因此进程被底层容器终止。在传统的 Node.js 应用程序中,这种情况从未发生过,因为它们通常在 Web 服务器后面运行,该服务器负责保持进程的正常运行,因此回调最终会被执行。

您必须 promisify https.request 或使用已与 Promises 配合使用的库,这样您就可以轻松地 await 它们。 AxiosRequest都是不错的选择。

一旦您选择了您的库 - 或已 promise https.request - (我将使用 axios 作为示例),您只需 await 在通话中,获取其结果并用它做任何您想做的事情。

const res = await axios.post('https://service-you-want-to-connect-to.com', {})
console.log(JSON.stringify(res)) // here you inspect the res object and decide what do to with the status code.

关于node.js - 我如何在 AWS Lambda 中返回状态代码和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58098244/

相关文章:

Java/Spring启动: How do I incorporate HTTPS?

python-3.x - 没有 API 网关的 Zappa Python 3.6 Lambda 函数

java - 从 Java 客户端调用 lambda 函数后如何访问 lambda 函数调用的云监视日志

javascript - 使用 nodejs 上传 blob

node.js - AWS SAM 本地 + DynamoDB 本地

docker - 将 SSL 证书添加到 Docker linux 容器

Apache SSL 不工作

amazon-web-services - 如何使用 aws cli 将 aws lambda 层部署包上传到 s3 存储桶?

javascript - 是否可以运行JavaScript(NodeJS)命令/函数,并在出现错误时让程序继续运行?

javascript - Node "EventEmitter memory leak detected"