我尝试实现mongoose watch
函数,因为我希望在clients
集合更新时更新users
集合中的一些字段,所以我在schema文件中有以下内容:
// ... schema code omitted for brevity.
const clientsCollection = mongoose.model('Client', clientSchema);
clientsCollection.watch<Client>([], { fullDocument: 'updateLookup' }).on('change', updateUser);
在updateUser
内部(在同一个文件中),我试图获得与id为abc123
的用户相关的所有文档的字段clientSalesValue
的求和结果:
async function updateUser(data: ChangeStreamDocument<Client>) {
//... some other not relevant code
const result = await clientsCollection.aggregate([
{
$match: { userId: new ObjectId('abc123') }
},
{
$group: {
_id: null,
totalSaleValue: { $sum: '$clientSalesValue' }
}
},
{
$unset: ['_id']
}
]).exec();
//... here goes the code that updates the user collection
}
但是我一保存文件我就从节点得到这个错误:
TypeError [ERR_INVALID_ARG_TYPE]: The "listener" argument must be of type function. Received undefined
问题在于聚合部分,如果我注解所有部分节点,则该部分节点不会再喊了。
我从错误消息中推断,我正在将undefined
传递给on
侦听器,但显然不是这样,我正在传递一个实际的函数。
现在我的函数隐式返回undefined(从Promise)是真的,因为我没有显式返回任何东西,但是即使我返回了一些东西,错误仍然存在。
我错过了什么?
1条答案
按热度按时间hi3rlvi21#
所以解决方法是在回调函数中传递函数,看起来我错误地解释了错误消息。
监听器必须是一个函数。我传递了一个函数,但那个函数在一天结束时返回了一个值(从它返回的值)。
以下是工作代码: