NestJS 存储库给出错误“未找到“TaskRepository”的元数据。”

问题描述 投票:0回答:1

GitHub 项目链接: nestjs-任务管理

错误日志:

[Nest] 15824  - 23/08/2023, 11:22:29     LOG [NestFactory] Starting Nest application...
[Nest] 15824  - 23/08/2023, 11:22:29     LOG [InstanceLoader] AppModule dependencies initialized +115ms
[Nest] 15824  - 23/08/2023, 11:22:29     LOG [InstanceLoader] TypeOrmModule dependencies initialized +1ms
[Nest] 15824  - 23/08/2023, 11:22:29     LOG [InstanceLoader] TypeOrmCoreModule dependencies initialized +182ms
[Nest] 15824  - 23/08/2023, 11:22:29     LOG [InstanceLoader] TypeOrmModule dependencies initialized +1ms
[Nest] 15824  - 23/08/2023, 11:22:29     LOG [InstanceLoader] TasksModule dependencies initialized +2ms  
[Nest] 15824  - 23/08/2023, 11:22:29     LOG [RoutesResolver] TasksController {/tasks}: +28ms
[Nest] 15824  - 23/08/2023, 11:22:29     LOG [RouterExplorer] Mapped {/tasks/:id, GET} route +5ms
[Nest] 15824  - 23/08/2023, 11:22:29     LOG [NestApplication] Nest application successfully started +4ms
[Nest] 15824  - 23/08/2023, 12:03:53   ERROR [ExceptionsHandler] No metadata for "TaskRepository" was found.
EntityMetadataNotFoundError: No metadata for "TaskRepository" was found.
    at DataSource.getMetadata (D:\SaifAli\NestJS Demo Projects\nestjs-task-management\src\data-source\DataSource.ts:444:30)
    at Repository.get metadata [as metadata] (D:\SaifAli\NestJS Demo Projects\nestjs-task-management\src\repository\Repository.ts:53:40)
    at Repository.findOne (D:\SaifAli\NestJS Demo Projects\nestjs-task-management\src\repository\Repository.ts:577:42)
    at TasksService.getTaskById (D:\SaifAli\NestJS Demo Projects\nestjs-task-management\src\tasks\tasks.service.ts:37:50)
    at TasksController.getTaskById (D:\SaifAli\NestJS Demo Projects\nestjs-task-management\src\tasks\tasks.controller.ts:24:30)
    at D:\SaifAli\NestJS Demo Projects\nestjs-task-management\node_modules\@nestjs\core\router\router-execution-context.js:38:29
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at D:\SaifAli\NestJS Demo Projects\nestjs-task-management\node_modules\@nestjs\core\router\router-execution-context.js:46:28
    at D:\SaifAli\NestJS Demo Projects\nestjs-task-management\node_modules\@nestjs\core\router\router-proxy.js:9:17

模块:

    "@nestjs/common": "^9.0.0",
    "@nestjs/core": "^9.0.0",
    "@nestjs/typeorm": "^10.0.0",
    "typeorm": "^0.3.17"

typeorm.config.ts:

import { TypeOrmModuleOptions } from "@nestjs/typeorm";

export const typeOrmConfig: TypeOrmModuleOptions = {
    type: 'postgres',
    host: 'localhost',
    port: 5432,
    username: 'postgres',
    password: 'root',
    database: 'taskmanagement',
    entities: [__dirname + '/../**/*.entity.{js,ts}'],
    synchronize: true,
};

tasks.module.ts:

import { TypeOrmModule } from '@nestjs/typeorm';
import { Module } from '@nestjs/common';
import { TasksController } from './tasks.controller';
import { TasksService } from './tasks.service';
import { TaskRepository } from './task.repository';

@Module({
  imports: [TypeOrmModule.forFeature([TaskRepository])],
  controllers: [TasksController],
  providers: [TasksService],
})
export class TasksModule {}

任务.实体.ts:

import { TaskStatus } from "./task-status.enum";
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class Task {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

    @Column()
    description: string;

    @Column()
    status: TaskStatus;
}

任务.repository.ts:

import { Repository } from 'typeorm';
import { Task } from './task.entity';

export class TaskRepository extends Repository<Task> {
  // Your custom repository methods can go here
}

任务.service.ts:

import { TaskRepository } from './task.repository';
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Task } from './task.entity';

@Injectable()
export class TasksService {
    constructor(
        @InjectRepository(TaskRepository)
        private taskRepository: TaskRepository,
    ) {};
    async getTaskById(id: number): Promise<Task> {
        const record = await this.taskRepository.findOne({ where: { id } });
        if (!record) {
            throw new NotFoundException();
        }
        return record;
    }
}

我尝试使用旧版本的 TypeORM,但这引入了新的错误,我想学习使用最新的方法来执行此操作。

我只在使用 Postman 到达端点时才收到此错误,并且从昨天开始我一直在尝试修复此问题,但无法找到任何类似的问题。一种是在 typeorm 配置文件中使用

entities: [__dirname + '/../**/*.entity.{js,ts}'],
,而我使用的是
autoLoadEntities: true
,所以我也尝试了,但没有改变任何东西。

我不明白我必须在哪里以及如何向存储库提供元数据。

我提前感谢你们在这里提供的任何帮助。

nestjs typeorm repository-pattern nestjs-typeorm
1个回答
0
投票

以下代码不正确。而不是

TaskRepository
,它需要是
Task
(来自
task.entity.ts

@Module({
  imports: [TypeOrmModule.forFeature([TaskRepository])],
  controllers: [TasksController],
  providers: [TasksService],
})
export class TasksModule {}

因此要解决此问题,您需要将其更改为:

import { Task } from './task.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Task])],
  controllers: [TasksController],
  providers: [TasksService],
})
export class TasksModule {}

请参阅 https://docs.nestjs.com/techniques/database#repository-pattern 了解更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.