升级Mongoose至4.10.5后Aggregate报错‘callback apply is not a function’求助
解决Mongoose 4.10.5中aggregate回调报错的方案
嘿,这个问题我之前升级Mongoose的时候也踩过坑!从旧版本升到4.x系列后,aggregate的调用规则变了,才会出现你说的“callback apply is not a function”报错,改起来其实很简单,主要是调整回调的写法:
必须用
exec()来传递回调函数
旧版本里你可能直接把回调函数作为第二个参数传给aggregate(),但在Mongoose 4.x中,aggregate()本身只会返回一个Aggregate实例对象,不会直接执行回调。正确的做法是调用实例的exec()方法来传入回调:// 错误的旧写法(在4.10.5中会报错) YourModel.aggregate([{ $match: { status: 'active' } }], function(err, results) { // 你的处理逻辑 }); // 正确的新写法 YourModel.aggregate([{ $match: { status: 'active' } }]) .exec(function(err, results) { // 你的处理逻辑 });链式操作后也要记得加
exec()
如果你的aggregate还搭配了sort、project这类链式方法,同样需要在最后用exec()来触发执行并传递回调,比如:YourModel.aggregate([{ $match: { type: 'post' } }]) .sort({ createdAt: -1 }) .limit(10) .exec(function(err, sortedResults) { // 处理排序后的结果 });排查自定义插件/中间件的兼容性
如果你给模型加过自定义的aggregate相关插件,可能在新版本Mongoose中存在兼容问题。可以先暂时禁用这些插件,测试aggregate是否能正常运行,逐步排查出问题插件后再更新插件代码。
简单来说,Mongoose 4.x开始规范了异步操作的执行方式,所有需要回调的查询/聚合操作都需要通过exec()来触发,这样做也能让代码的异步流程更清晰。
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

