Javascript Lambda函数在异步请求结束之前不会返回
我想创建一个调用API(第三方)并立即返回的函数,但它正在等待API响应 以下是代码示例:Javascript Lambda函数在异步请求结束之前不会返回,javascript,node.js,aws-lambda,node-request,serverless-framework,Javascript,Node.js,Aws Lambda,Node Request,Serverless Framework,我想创建一个调用API(第三方)并立即返回的函数,但它正在等待API响应 以下是代码示例: var request = require('request'); // When I call functionOne it should trigger functionTwo and should end immediately, // but unfortunately, it is waiting for functionTwo to end module.exports.functionO
var request = require('request');
// When I call functionOne it should trigger functionTwo and should end immediately,
// but unfortunately, it is waiting for functionTwo to end
module.exports.functionOne = (event, context, cb) => {
const uri = 'https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/functionTwo';
request.post({ uri: uri });
cb(null, "done functionOne");
};
module.exports.functionTwo = (event, context, cb) => {
console.log("i'm functionTwo");
setTimeout(function () {
console.log("I'm functionTwo about to end");
context.succeed("done functionTwo");
}, 5000);
};
此外,如果我尝试调用context.succeed()
而不是cb()
,它甚至会阻止API调用和函数在不调用API的情况下立即返回
我还创建了一个关于的问题
其他信息:
- 无服务器框架:v1.0.0-rc.2
- 节点:v6.9.1
- OS:赢10分
request.post()
调用另一个函数时,必须提供回调,并且必须等待回调完成
您可以调用request.abort()
,但这是一个黑客解决方案
module.exports.functionOne = (event, context, cb) => {
const uri = 'https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/functionTwo';
const r = request.post({ uri: uri }, (error, response, body) => {
cb(error, "done functionOne");
});
r.abort();
cb(null, 'forced abort on functionOne');
};
为什么会这样?因为你不能马上中止。您需要等待几毫秒,才能在另一台服务器中接收到请求,但无法确切知道它发生的时间
如果您知道第二个Lambda将运行2分钟,则可以添加setTimeout
函数以在5秒后中止请求,并避免functionOne
在空闲状态下长时间运行。但同样,这是一个糟糕的解决方案
为什么不将functionTwo
代码放在functionOne
中,以避免启动第二个Lambda
另一个解决方法是从
functionOne
调用SNS主题,并将此主题配置为触发functionTwo
functionTwo就在这里,举个例子,在实际情况中,有一个api是第三方的,我正在向该api发送post请求和一些数据,实际上它是OK,因此,我建议您针对SlackAPI创建另一个问题。如果它是另一个Lambda函数,您可以使用SNS,因为它只需几毫秒即可返回。如果Slack需要几秒钟才能完成,我不知道他们是否提供了另一种无需等待的方式来排队请求。否则,您可以中止请求以强制Lambda提前停止,但正如我所说的,您需要在Slack收到请求之前等待几分钟。很遗憾,中止请求并没有解决我的问题