Waterline调用stream方法时eachBatch回调无法触发问题咨询
问题原因分析
你遇到的eachBatch无输出的问题,是使用方式不匹配当前Waterline版本的API规则导致的,核心问题有两点:
- 回调参数格式错误:Sails v1.x及之后的版本中,
eachBatch已不再使用(err, records)的错误优先回调格式,回调的第一个入参直接是当前批次的记录数组,错误需要通过外层try/catch或者链式.catch()捕获。你写的回调把第一个参数当成错误对象,自然不会执行打印逻辑。 - 缺少异步执行触发逻辑:你测试
eachRecord时添加了await等待异步流执行完成,但eachBatch的调用既没有加await,也没有挂载exec执行回调,程序很可能在流处理完成前就提前退出,导致无输出。
正确使用示例
推荐使用async/await模式适配新版API:
try { await MyModel.stream({ isSubscribed: true }) .populate("user") .eachBatch(10, async (records) => { console.log("Code reached inside stream results,当前批次条数:", records.length) }) console.log("所有批次处理完成") } catch (err) { console.error("流处理出错:", err) }
如果是兼容旧版本Waterline,需要补充exec触发执行:
MyModel.stream({ isSubscribed: true }) .populate("user") .eachBatch(10, function(err, records){ if (err) { console.error("批次处理错误:", err) return } console.log("Code reached inside stream results") }) .exec(function (err) { if (err) console.error("整体流处理错误:", err) })
补充说明
你使用find方法时调用了exec触发执行、使用eachRecord时添加了await等待执行,所以这两个调用都能正常输出,和查询条件、关联查询逻辑无关。
内容的提问来源于stack exchange,提问作者fossmoat
相关产品推荐
相关产品推荐

