我使用无服务器框架为AWS创建了一个Node.js Lambda函数,用于基于事件参数在Postgres数据库中增加不同的计数器。使用serverless invoke local
调用时,该函数本身运行时没有任何错误,它按预期运行并正常工作,但是,当从Java调用时,它应该完成并返回,但只是超时。
我已经尝试了几种方法,包括等待Postgres池关闭,增加超时时间,使用回调函数返回(尽管这样做很清楚,因为函数可以在此结束,这是一个很好的习惯),并且使用了promise链而不是异步等待,没有运气。真正的问题是,这仅仅是它如何工作的,我必须总是添加callbackWaitsForEmptyEventLoop(false)
还是有一个更优雅的解决方案?我什至尝试了why-is-node-running程序包,它说4个句柄使进程保持运行,一个TCPWRAP,一个超时和两个TickObjects。我几乎可以确定,在我创建多个lambda函数遇到相同问题的情况下,node-postgres引起了这一问题。
// These are the last lines of the handler function
const insertQueries = [
// Multiple queries using a node-postgres pool, e.g.
// pool.query(...);
];
try {
await Promise.all(insertQueries);
} catch(err) {
return callback('Couldn\'t insert API stats: ' + err);
}
return callback(null, 'API stats inserted successfully!');
AWS Java SDK仅打印一条调试消息,告诉我任务在10.01秒后超时(serverless.yml设置为10秒)。