TypeORM error with MongoDB: .find() does not work, error: TypeError: Cannot read property 'prototype' of undefined

Viewed 2508

I set up a Nest.Js / TypeORM / MongoDB stack as described here.

It works to create an object user in MongoDB using the create() function, the object is recorded into the right database into the User collection.

However, when I attempt to get it using the find({id}) or the findAll() function I get an error and I cannot get the item from the database even though it's there.

Here is my user.service.ts file:

import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { MongoRepository } from 'typeorm';
import { validate } from 'class-validator';
import { CreateUserDto } from './user.dto';
import { User } from '../model/user.entity';
import { UserRO } from './user.interface';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: MongoRepository<User>,
  ) {}

  // abstracting access to the model via service
  public async getAll() {
    // getting data from database
    return await this.userRepository.find();
  }

  // abstracting access to the model via service
  public async get(id: string) {
    const user = await this.userRepository.findOne({ _id: id });
    if (!user) {
      const errors = { User: ' not found' };
      throw new HttpException({ errors }, 401);
    }

    return this.buildUserRO(user);
  }



  async create(dto: CreateUserDto): Promise<UserRO> {
    // check uniqueness of username/email
    const { username } = dto;
    const newUser = new User();
    newUser.username = username;
    // newUser.contexts = [];

    const errors = await validate(newUser);
    if (errors.length > 0) {
      const _errors = { username: 'Userinput is not valid.' };
      throw new HttpException(
        { message: 'Input data validation failed', _errors },
        HttpStatus.BAD_REQUEST,
      );
    } else {
      const savedUser = await this.userRepository.save(newUser);
      return this.buildUserRO(savedUser);
    }
  }


}

and also the user.interface.ts:

export interface UserData {
  username: string;
  _id: string;
}

// user response object
export interface UserRO {
  user: UserData;
}

and a part of the user.controller.ts:

  @Get(':id')
  findOne(@Param('id') id: string): Promise<UserRO> {
    console.log(`getting user with id: ${id}`);
    const user = this.serv.get(id);
    return user;
  }

and finally the model/user.entity.ts:

@Entity({ name: 'User' })
export class User {
  @ObjectIdColumn()
  _id: string;

  @Column({ type: 'varchar', length: 50 })
  username: string;

  @OneToMany((type) => Context, (context) => context.user)
  contexts: Context[];
}

The error I get when I try to find the saved context:

[Nest] 75671  - 09/22/2021, 9:22:18 PM   ERROR [ExceptionsHandler] Cannot read property 'prototype' of undefined
TypeError: Cannot read property 'prototype' of undefined
    at FindCursor.cursor.toArray (/Users/deemeetree/Documents/Root/benchmark-sql-graph/src/entity-manager/MongoEntityManager.ts:707:37)
    at MongoEntityManager.<anonymous> (/Users/deemeetree/Documents/Root/benchmark-sql-graph/src/entity-manager/MongoEntityManager.ts:190:46)
    at step (/Users/deemeetree/Documents/Root/benchmark-sql-graph/node_modules/typeorm/node_modules/tslib/tslib.js:143:27)
    at Object.next (/Users/deemeetree/Documents/Root/benchmark-sql-graph/node_modules/typeorm/node_modules/tslib/tslib.js:124:57)
    at fulfilled (/Users/deemeetree/Documents/Root/benchmark-sql-graph/node_modules/typeorm/node_modules/tslib/tslib.js:114:62)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

I tried with MongoDB 4. and 3. versions and it's the same problem.

What am I doing wrong and how to get pass this error and be able to query the records well in MongoDB?

Thanks!

2 Answers

This is a version issue. To fix this try to use version 3 by downgrading

First remove existing mongodb package

npm uninstall mongodb
// Or
yarn remove mongodb

Then install again with version 3.

npm install mongodb@3
// Or
yarn add mongodb@3
Related