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!