'NestJS/TypeORM: Cannot set property metadata of #<Repository> which has only a getter
I try to run my nestjstutorial app, the below error is showing. My backend is connected to a PostgreSQL db.
TypeError: Cannot set property metadata of # which has only a getter at EntityManager.getCustomRepository (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\src\entity-manager\EntityManager.ts:1404:59) at DataSource.getCustomRepository (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\src\data-source\DataSource.ts:465:29) at InstanceWrapper.useFactory [as metatype] (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\node_modules@nestjs\typeorm\dist\typeorm.providers.js:13:35) at Injector.instantiateClass (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\node_modules@nestjs\core\injector\injector.js:333:55) at callback (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\node_modules@nestjs\core\injector\injector.js:48:41) at processTicksAndRejections (node:internal/process/task_queues:96:5) at Injector.resolveConstructorParams (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\node_modules@nestjs\core\injector\injector.js:122:24) at Injector.loadInstance (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\node_modules@nestjs\core\injector\injector.js:52:9) at Injector.loadProvider (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\node_modules@nestjs\core\injector\injector.js:74:9) at Injector.lookupComponentInImports (D:\Ganesh\MyDrive\nestjs\nestjs_tutorial\nestjsturorial\node_modules@nestjs\core\injector\injector.js:265:17)
My code looks like this:
app.module
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserController } from './user/user.controller';
import { UserModule } from './user/user.module';
import { UserService } from './user/user.services';
import { QuizModule } from './modules/quiz/quiz.module';
//import { QuizController } from './modules/quiz/quiz.controller';
//import { QuizService } from './modules/quiz/quiz.services';
import { TypeOrmModule } from '@nestjs/typeorm';
import { typeOrmConfig } from './config/typeorm.config';
//import { QuizRepository } from './modules/quiz/quiz.repository';
@Module({
imports: [UserModule, QuizModule, TypeOrmModule.forRoot(typeOrmConfig)],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
quiz.controller
import {
Body,
Controller,
Get,
HttpCode,
Post,
UsePipes,
ValidationPipe,
} from '@nestjs/common';
import { QuizService } from './quiz.services';
import { CreateQuizDto } from '../dto/CreateQuiz.dto';
@Controller('quiz')
export class QuizController {
constructor(private readonly quizService: QuizService) {}
@Get('/')
getAllQuiz() {
return this.quizService.getAllQuiz();
}
@Post('/create')
@HttpCode(200)
@UsePipes(ValidationPipe)
async createQuiz(@Body() quizData: CreateQuizDto) {
return await this.quizService.createNewQuiz(quizData);
}
}
quiz.services
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { QuizRepository } from './quiz.repository';
import { CreateQuizDto } from '../dto/CreateQuiz.dto';
@Injectable()
export class QuizService {
constructor(
@InjectRepository(QuizRepository) private quizRepository: QuizRepository,
) {}
getAllQuiz() {
return [1, 2, 'from service', 3];
}
async createNewQuiz(quiz: CreateQuizDto) {
return await this.quizRepository.save(quiz);
}
}
quiz.module
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { QuizController } from './quiz.controller';
import { QuizService } from './quiz.services';
import { QuizRepository } from './quiz.repository';
@Module({
controllers: [QuizController],
imports: [TypeOrmModule.forFeature([QuizRepository])],
providers: [QuizService],
})
export class QuizModule {}
quiz.repository
import { EntityRepository, Repository } from 'typeorm';
import { Quiz } from './quiz.entity';
@EntityRepository(Quiz)
export class QuizRepository extends Repository<Quiz> {
//<Quiz> means Quiz module
}
typeorm.config
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
export const typeOrmConfig: TypeOrmModuleOptions = {
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: '123456',
database: 'quiz',
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
synchronize: true,
};
dto
import { isNotEmpty, IsNotEmpty, Length } from 'class-validator';
export class CreateQuizDto {
@IsNotEmpty({ message: 'Title mandatory' })
@Length(3, 255)
title: string;
@IsNotEmpty()
@Length(3)
description: string;
}
entity
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity('quizes')
export class Quiz extends BaseEntity {
@PrimaryGeneratedColumn({
comment: 'The quiz unique identifier',
})
id: number;
@Column({
type: 'varchar',
})
title: string;
@Column({
type: 'text',
})
description: string;
@Column({
type: 'varchar',
})
usernmae: string;
@Column({
type: 'date',
})
createddate: Date;
@Column({
type: 'boolean',
default: 1,
})
isActive: boolean;
}
Somebody know how can I fix this?
Solution 1:[1]
I had the same problem and the solution was the following: you have to make sure that the version of nestjs/typeorm and typeorm are compatible in my case I had version of nestjs/typeorm 8.0.3 and typeorm 0.3.6 , these versions are not compatible , version 8.0.3 of nest is compatible with version 0.2.34. When I changed my typeorm version to 0.2.34 it compiled successfully.
Solution 2:[2]
Which version of @nestjs/typeorm and typeorm are you using? If you are using typeorm > 0.3 this is a known issue and using the required typeorm will solve the issue.
Solution 3:[3]
since you are using CustomRepository
you should remove the InjectRepository
decorator and simply let NestJS
inject it.
quiz.service
constructor(
private quizRepository: QuizRepository,
) {}
you haven't posted your typeorm.config
file so make sure to declare Quiz
entity so TypeORM
will know where to look for it.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | KLanger |
Solution 3 | Hagai Kalinhoff |