带有 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 的新连接。
如果你想每个请求connect
和destroy
,那么你需要在函数内部实例化knex
。
我一直在用 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 的新连接。
如果你想每个请求connect
和destroy
,那么你需要在函数内部实例化knex
。