Knex 0.14.2结合Node.js 8使用async/await构建动态Where子句遇阻求助
解决Knex 0.14.2中async/await动态构建Where子句的问题
哥们,你遇到的问题核心在于Knex的查询构建逻辑是同步的,你把async函数传给mainQuery.where()的做法行不通——Knex不会等待这个async函数里的异步操作完成,就已经完成了主查询的构建,所以你的where条件根本没加上,反而那个内部查询会在主查询之后才执行,完全不符合预期。
正确的处理思路
你需要把「前置查询」和「主查询构建」拆成明确的两步:先异步执行前置查询拿到结果,再用结果动态给主查询添加where条件,最后执行主查询。因为必须等前置查询的结果出来,才能确定要加什么条件,不能在构建主查询的过程中插入异步操作。
具体代码示例
async function fetchTargetData() { // 第一步:先执行前置查询,await拿到结果 const preQueryResult = await knex('table').select(); // 第二步:初始化主查询 let mainQuery = knex('your_main_table'); // 替换成你的主表名称 // 第三步:根据前置结果动态添加where条件 // 这里假设你需要判断preQueryResult中是否存在符合要求的x值,可按需调整逻辑 const shouldAddCondition = preQueryResult.some(item => item.x); if (shouldAddCondition) { mainQuery = mainQuery.where('y', 'x'); } // 第四步:执行主查询并返回结果 const finalResult = await mainQuery; return finalResult; } // 调用函数并处理错误 fetchTargetData().catch(err => console.error('查询出错:', err));
为什么原来的写法不行?
Knex的.where()方法接受的回调函数是同步执行的,当你传入async函数时,这个函数会立即返回一个Promise,但Knex不会等待这个Promise resolve,而是直接继续构建查询。所以你的await knex('table').select()会延后执行,主查询已经构建完成并发送出去了,自然不会带上你想要的where条件。
内容的提问来源于stack exchange,提问作者NorTicUs
相关产品推荐
相关产品推荐

