带有 KnexJs 的 AWS Lambda(node12.x) 仅在第一个 运行 上调用并且在后续时间失败

AWS Lambda(node12.x) with KnexJs only invoke on first run and fails on the subsequent times

我一直在用 node+knex 尝试 aws lambda 并且遇到了与这个问题相同的问题: AWS Lambda with Knex JS and RDS Postgres

这是我的 handler.js 代码:

const knex = require('knex')({
  client: 'pg',
  connection: {...},
});
reports = []
async function run() {
  ///running some codes
  foo.query().insert ()
  bar.query().insert()
  knex.client.destroy();
  return reports
}

module.exports.testing123 = async event => {
  const results = await run()  
  return results
}

第一次 运行 调用该函数总是可以正常工作,但如果我尝试再次调用它,它将 return 错误:

2020-09-20T20:14:09.251Z    4ca734a3-a780-44e3-a881-eebdc27effb0    ERROR   Invoke Error    {"errorType":"Error","errorMessage":"Unable to acquire a connection","stack":["Error: Unable to acquire a connection","    at Client_PG.acquireConnection (/var/task/node_modules/knex/lib/client.js:340:30)","    at Runner.ensureConnection (/var/task/node_modules/knex/lib/runner.js:248:8)","    at Runner.run (/var/task/node_modules/knex/lib/runner.js:27:12)","    at Builder.Target.then (/var/task/node_modules/knex/lib/interface.js:15:43)","    at processTicksAndRejections (internal/process/task_queues.js:97:5)"]}

删除 'knex.client.destroy()' 行将解决此问题,但我认为这不是正确的解决方案,因为我们应该在使用连接后始终销毁。

再次部署代码也会 运行 第一次正常

在导出的处理程序之外定义的任何内容都保留在提供的 lambda 实例上。所以发生的事情是实例从 knex 连接开始,但在第一次请求时被销毁。在这种情况下,您不会在对 lambda 的每个新请求上创建与 knex 的新连接。

如果你想每个请求connectdestroy,那么你需要在函数内部实例化knex