Mongoose监视函数-“listener”参数必须是函数类型,接收到未定义的

f5emj3cl  于 2023-01-13  发布在  Go
关注(0)|答案(1)|浏览(154)

我尝试实现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)是真的,因为我没有显式返回任何东西,但是即使我返回了一些东西,错误仍然存在。
我错过了什么?

hi3rlvi2

hi3rlvi21#

所以解决方法是在回调函数中传递函数,看起来我错误地解释了错误消息。
监听器必须是一个函数。我传递了一个函数,但那个函数在一天结束时返回了一个值(从它返回的值)。
以下是工作代码:

clientsCollection.watch<Client>([], { fullDocument: 'updateLookup' }).on('change', (data) => updateUser(data));

相关问题