Home > Back-end >  Mongoose find problem - TypeError: Cannot read property 'find' of undefined
Mongoose find problem - TypeError: Cannot read property 'find' of undefined

Time:06-07

I'm having a issue with a mongoose find() query, which I cannot figure out. the error I receive is "TypeError: Cannot read property 'find' of undefined" which I suspect is an export/import problem. Any help would be greatly appreciated.

here is my scheme model file:

const mongoose = require('mongoose');

const RoleSchema = new mongoose.Schema({
  pageGroup: { 
    type: String, 
    required: true,
  },
  level: { 
    type: String, 
    required: true,
  }
})

const OfficeSchema = new mongoose.Schema({
  officeId: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: "Office",
    required: true,
  },
  roleId: { 
    type: [mongoose.Schema.Types.ObjectId], 
    required: false,
  },
})

const InstanceSchema = new mongoose.Schema({
  instanceId: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: "Instance",
    required: true,
  },
  offices: { 
    type: [OfficeSchema], 
    required: false,
  },
})

const UserSchema = new mongoose.Schema({
      firstName: { 
        type: String, 
        required: true 
      },
      lastName: { 
        type: String, 
        required: true 
      },
      email: { 
        type: String, 
        required: false 
      },
      password: { 
        type: String, 
        required: false 
      },
      access: {
        type: [InstanceSchema], 
        required: false,
      }, 
      permissions: {
        type: [RoleSchema], 
        required: false,
      },
      activationToken: {
        type: String,
        required: false,
      },
      roleId: { // new
          type: mongoose.Schema.Types.ObjectId,
          // index: true,
          ref: 'Role',
          // default: null
      },
      employeeId: {
          type: String, 
          required: false 
      },
      instanceId: {
          type: mongoose.Schema.Types.ObjectId, 
          ref: 'Instance', 
          required: true 
      },
      officeId: {
          type: mongoose.Schema.Types.ObjectId, 
          ref: 'Office', 
          required: true 
      }, 
    }, 
    {
      toJSON: { virtuals: true },
      toObject: { virtuals: true },
    })

UserSchema.virtual('instances', {
  ref: 'Instance',
  localField: 'access.instanceId',
  foreignField: '_id',
});

UserSchema.virtual('instances.offices', {
  ref: 'Office',
  localField: 'access.offices.officeId',
  foreignField: '_id',
});

UserSchema.virtual('office', {
  ref: 'Office',
  localField: 'officeId',
  foreignField: '_id',
  justOne: true,
});

UserSchema.virtual('name').get(function() {
  return this.firstName   " "   this.lastName
});

const User = mongoose.model('User', UserSchema);
module.exports = { User } 

here is my function in my controller file:

const { User } = require('./user.model');

async getEmployees(){
    
    const employees = await User.find({
            instanceId: this._id,
        }, '-password -activationToken -__v -activated')
        .populate('office')
        .sort([['firstName', 1]])
        .exec()

    return employees
},

CodePudding user response:

The error points to User being undefined, which can happen when your project has cyclic dependencies (where file A.js depends on file B.js, which in turn depends on file A.js again, either directly or indirectly through another file).

A quick fix is to delay loading the User model until the moment it's actually needed, by moving the require() into getEmployees():

async getEmployees(){
    const { User } = require('./user.model');
    
    const employees = await User.find({
            instanceId: this._id,
        }, '-password -activationToken -__v -activated')
        .populate('office')
        .sort([['firstName', 1]])
        .exec()

    return employees
}

But ideally, you should get rid of the cyclic dependency altogether.

  • Related