保存到变量的Knex Query添加映射条件失效,求解决方案
问题原因
你遇到的问题本质是Knex查询构建器是状态可变的实例:当你把db.select('*').from('users')赋值给query变量后,这个变量指向的是同一个查询构建器对象。在map循环中反复调用query.modify()时,所有的where条件都会叠加到同一个实例上,最终所有异步请求都会使用最后一次修改后的查询条件,导致结果不符合预期。
解决方案
有两种可靠的方式实现查询复用+独立条件修改:
1. 封装基础查询为函数
每次调用函数都会生成一个全新的查询构建器实例,确保每个循环迭代的查询都是独立的:
// 封装基础查询为函数,每次调用返回新的实例 const getUsersBaseQuery = () => db.select('*').from('users'); const users = await Promise.all(['John', 'Doe'].map((firstName) => getUsersBaseQuery().modify((builder) => builder.where({ firstName })) ));
2. 使用clone()方法复制查询实例
Knex提供了clone()方法,可以复制当前查询构建器的状态并生成一个新实例,这样每个循环迭代都操作独立的副本:
const baseQuery = db.select('*').from('users'); const users = await Promise.all(['John', 'Doe'].map((firstName) => baseQuery.clone().modify((builder) => builder.where({ firstName })) ));
这两种方式都能保证每个map迭代中的查询构建器是独立的,不会互相干扰条件,最终得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Chukwualuka Chiama
相关产品推荐
相关产品推荐

