问题描述: 在使用AWS Lambda(node12.x)和KnexJs时,发现在第一次运行时可以成功调用,但在随后的运行中却失败了。
解决方法: 这个问题可能是由于KnexJs的连接池在Lambda函数重用上的行为导致的。当AWS Lambda函数完成第一次调用并准备重用时,KnexJs的连接池可能处于不可用状态,导致后续调用失败。
要解决这个问题,可以尝试以下方法:
const knex = require('knex');
exports.handler = async (event, context) => {
// 创建Knex实例
const db = knex({
client: 'mysql',
connection: {
host: 'localhost',
user: 'username',
password: 'password',
database: 'database',
},
});
try {
// 执行查询操作
const result = await db.select().from('table');
// 处理查询结果
// ...
// 手动释放Knex连接池
await db.destroy();
return result;
} catch (error) {
// 处理错误
// ...
// 手动释放Knex连接池
await db.destroy();
throw error;
}
};
db.migrate.latest()
方法来确保数据库迁移已经完成。示例代码如下:const knex = require('knex');
const { migrate } = require('db-migrate');
exports.handler = async (event, context) => {
// 创建Knex实例
const db = knex({
client: 'mysql',
connection: {
host: 'localhost',
user: 'username',
password: 'password',
database: 'database',
},
});
try {
// 执行数据库迁移
await migrate({
onChange: () => {}, // 迁移完成后的回调函数
db: db,
});
// 执行查询操作
const result = await db.select().from('table');
// 处理查询结果
// ...
// 手动释放Knex连接池
await db.destroy();
return result;
} catch (error) {
// 处理错误
// ...
// 手动释放Knex连接池
await db.destroy();
throw error;
}
};
通过以上方法,可以确保KnexJs在每次Lambda函数调用之前都处于可用状态,并在每次调用结束后手动释放连接池,以避免后续调用失败的问题。