NestJS-Mongoose:无法在 ChangeEvent<any> 上访问 fullDocument

h4s*_*sop 5 model watch mongoose typescript nestjs

我有以下基本代码片段,我的目标是从 获取 fullDocument 属性,obj: ChangeEvent但是我无法访问此属性 ( Property 'fullDocument' does not exist on type 'ChangeEvent<any>')。我可以访问的唯一属性是 _id、clusterTime 和 operationType。有什么我遗漏的,还是我应该非直接查询 fullDocument ( obj['fullDocument'])?

const changeStream = this.model.watch([], { fullDocument: 'updateLookup' })
      .on('change', obj => {
        console.log(obj.fullDocument);
      });
Run Code Online (Sandbox Code Playgroud)

kaz*_*vac 3

您遇到的问题(TypeScript 抱怨缺少属性)是由于mongoose 方法中的非专门返回类型泛型造成的(在这两种类型和官方类型中,我假设您正在使用 mongoose 5.x 分支)。mongodb.ChangeStreamModel.watch@types/mongoosemongoose

例如,@types/mongodb包正确地声明/专门化了方法的返回类型watch

真正的解决方案是创建一个拉请求,修复watch上述包存储库中返回类型的返回类型,和/或向维护人员报告问题。为了快速“修复”,您可以采用像这样的类型转换(对于最干净的changeStream形状,MySchema应该是您用 注释的类@Schema):

const changeStream = this.model
  .watch([], { fullDocument: 'updateLookup' }) as ChangeStream<MySchema>; // <-- specialize using the cast
      
changeStream.on('change', obj => {
  console.log(obj.fullDocument);
});
Run Code Online (Sandbox Code Playgroud)

另请注意,MongoDB Change Stream需要副本集或分片集群。