在异步 AWS Lambda 函数中使用带有 node-fetch 模块的 node.js 时遇到问题
Posted
技术标签:
【中文标题】在异步 AWS Lambda 函数中使用带有 node-fetch 模块的 node.js 时遇到问题【英文标题】:trouble using node.js w/ node-fetch module in async AWS Lambda Function 【发布时间】:2020-03-24 15:44:57 【问题描述】:这是我想要做的:我有一个由 webhook 触发的 lambda 函数,该函数将处理该数据并使用它向 api 发出 POST 请求。
我正在使用 Node.js 12 和 node-fetch 模块。
现在该函数被正确触发,但它不会在第一次调用时发送 POST。但是如果我在短时间内重复触发 lambda 函数,第一次之后的请求就会通过。
这是我的 lambda 函数的 index.js 文件中的代码:
const fetch = require('node-fetch');
exports.handler = async (event) =>
sendPost();
const response =
statusCode: 200,
body: "Ok",
;
return response;
;
function sendPost()
const url = "http://requestbin.net/r/vjv4mvvj";
const body =
foo: "foo",
bar: "bar",
baz: "baz"
;
const params =
method: "POST",
mode: "cors",
headers: "Content-Type":"application/json",
body: JSON.stringify(body)
;
fetch(url, params);
当我删除 (event) 前面的 async 时,请求第一次通过,但首先发送 webhook 的服务器没有'没有得到回应。
所以基本上我需要在每次调用函数时发送 POST 并且还能够返回 200 状态码。
我没有太多使用异步的经验,所以我知道它与异步有关,但我正在摸不着头脑。
【问题讨论】:
【参考方案1】:获取返回一个承诺,你需要一个await
。您还需要将sendPost
函数标记为async
。您还需要处理函数来等待sendPost
函数完成。
const fetch = require('node-fetch');
exports.handler = async (event) =>
await sendPost();
const response =
statusCode: 200,
body: "Ok",
;
return response;
;
async function sendPost()
const url = "http://requestbin.net/r/vjv4mvvj";
const body =
foo: "foo",
bar: "bar",
baz: "baz"
;
const params =
method: "POST",
mode: "cors",
headers: "Content-Type":"application/json",
body: JSON.stringify(body)
;
await fetch(url, params);
【讨论】:
通过将 async/await 应用于 sendPost() 它隐式地返回一个承诺。在 sendPost() 结束时简单地返回 fetch 的承诺而不是内联等待它会更清晰/简洁。它在 handler.anyway 的开头等待。以上是关于在异步 AWS Lambda 函数中使用带有 node-fetch 模块的 node.js 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
AWS SDK (PHP):异步调用 lambda 函数,检索状态