我正在编写一个 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
它们。 Axios和 Request都是不错的选择。
一旦您选择了您的库 - 或已 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/