试图使用Knex onConflict超时我的云函数



我正试图将geoJSON数据插入到PostGIS实例中,并且每次运行时通常都有重复的数据。我正在循环这个geoJSON数据,并尝试使用knext .js onConflict修饰符来忽略当发现重复的关键字段时,但是,它会超时我的云功能。

async function insertFeatures() {
try {
const results = await getGeoJSON();
pool = pool || (await createPool());
const st = knexPostgis(pool);
for (const feature of results.features) {
const { geometry, properties } = feature;
const { region, date, type, name, url } = properties;
const point = st.geomFromGeoJSON(geometry);
await pool('observations').insert({ 
region: region,
url: url,
date: date,
name: name,
type: type,
geom: point,
})
.onConflict('url')
.ignore()
}
} catch (error) {
console.log(error)
return res.status(500).json({
message: error + "Poop"
});
}
}

超时错误可能由多种原因引起,可能是函数正在处理的事务批处理大小,也可能是连接池大小或数据库服务器限制。在您的云函数中,检查是否在设置池时,knex允许我们选择性地注册afterCreate回调,如果添加了此回调,则您将调用作为最后一个参数传递给已注册回调的完成回调,否则将无法获得连接,导致超时。

查看knex内部正在做什么的一种方法是在运行代码之前设置DEBUG=knex:*环境变量,以便在代码执行时knex输出有关查询,事务和池连接的信息。建议您设置来自数据库服务器的批处理大小、连接池大小和连接限制,以匹配您推送到服务器的工作负载,这确保了导致的基本超时问题。
也可以在这里查看类似的例子:

  • Knex超时错误获取连接
  • 尝试批量插入时发生knexjs错误超时
  • 升级knex后出现超时错误
  • Knex超时获取连接