mongodb-js / mongoose-autopopulate

Always populate() certain fields in your mongoose schemas
Apache License 2.0
221 stars 36 forks source link

Missing `schemaStack` argument in `eachPathRecursive` method calling? #113

Closed jan-kacina closed 1 year ago

jan-kacina commented 1 year ago

Hi, we're experiencing the following error when nested discriminators are used in models:

/home/developer/repos/rc-suite/packages/backend/node_modules/mongoose-autopopulate/index.js:225
  if (schemaStack.has(schema)) {
                  ^

TypeError: Cannot read properties of undefined (reading 'has')
    at eachPathRecursive (/home/developer/repos/rc-suite/packages/backend/node_modules/mongoose-autopopulate/index.js:225:19)
    at /home/developer/repos/rc-suite/packages/backend/node_modules/mongoose-autopopulate/index.js:240:11
    at Schema.eachPath (/home/developer/repos/rc-suite/packages/backend/node_modules/mongoose/lib/schema.js:1484:5)
    at eachPathRecursive (/home/developer/repos/rc-suite/packages/backend/node_modules/mongoose-autopopulate/index.js:233:10)
    at getPathsToPopulate (/home/developer/repos/rc-suite/packages/backend/node_modules/mongoose-autopopulate/index.js:154:3)
    at autopopulatePlugin (/home/developer/repos/rc-suite/packages/backend/node_modules/mongoose-autopopulate/index.js:4:27)
    at Schema.plugin (/home/developer/repos/rc-suite/packages/backend/node_modules/mongoose/lib/schema.js:1884:3)
    at _buildSchema (/home/developer/repos/rc-suite/packages/backend/node_modules/@typegoose/typegoose/lib/internal/schema.js:119:21)
    at buildSchema (/home/developer/repos/rc-suite/packages/backend/node_modules/@typegoose/typegoose/lib/typegoose.js:145:37)
    at getModelForClass (/home/developer/repos/rc-suite/packages/backend/node_modules/@typegoose/typegoose/lib/typegoose.js:77:41)

It looks like there is missing schemaStack argument in eachPathRecursive method calling on index.js line 248

When the schemaStack argument is added (see below), everything works as expected.

...
if (schemaType.schema.discriminators != null) {
  for (const discriminatorName of Object.keys(schemaType.schema.discriminators)) {
    eachPathRecursive(schemaType.schema.discriminators[discriminatorName], handler, path, schemaStack);
  }
}
...
Our npm packages stack: Package Version
mongoose ~7.1.0
mongoose-autopopulate ^1.0.0
@typegoose/typegoose ^11.1.0

Is it just a not-yet discovered typo or is there something more behind the not-used schemaStack argument?

Thanks and regards, Jan Kacina

jan-kacina commented 1 year ago

Now I realize, it's a duplicate of issue 107

vkarpov15 commented 1 year ago

Thanks for reporting and for clarifying that this was a problem with nested discriminators. Fix is in v1.0.1.