类型错误:无法读取未定义的属性“findOneBy”

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

我是 Nestjs 的新手,在使用这些版本的 typeOrm "@nestjs/typeorm": "^9.0.1", "typeorm": "^0.3.11" 时,我得到了这个错误“TypeError:无法读取未定义的属性'findOneBy'”我真的不明白为什么。所以我读到 findOne 已被弃用,我可以使用 findByOne 代替。但每次我尝试使用邮递员进行测试。我收到这个错误。附件是下面终端中的错误。任何有关如何解决此问题的帮助将不胜感激,我

我尝试将 typeorm 的版本更改为较低版本“^0.2.32”,这修复了错误,但在运行时引入了另一个错误。但我想使用我在网上搜索的更新版本,看看是否能找到任何帮助,但没有一个与我的问题相关。

这是我的代码。另外,我注意到 EntityRepository 已被删除,因为它已被弃用。

任务.存储库

import { Injectable } from '@nestjs/common';
import { EntityRepository, Repository } from 'typeorm';
import { Task } from './task.entity';

@Injectable()
@EntityRepository(Task)
export class TasksRepository extends Repository<Task> {}

tasks.controller.ts

import {
Body,
Controller,
Get,
Param,
Post,
} from '@nestjs/common';
import { CreateTaskDto } from './dto/create-task.dto';
import { Task } from './task.entity';
import { TasksService } from './tasks.service';

@Controller('tasks')
export class TasksController {
constructor(private tasksService: TasksService) {}

@Get('/:id')
getTaskById(@Param('id') id: string): Promise<Task> {
return this.tasksService.getTaskById(id);

}

@Post()
createTask(@Body() createTaskDto: CreateTaskDto): Promise<Task> 
{
 return this.tasksService.createTask(createTaskDto);
}

}

任务.服务

import { Injectable, NotFoundException } from '@nestjs/common';
import { TasksRepository } from './task.repository';
import { InjectRepository } from '@nestjs/typeorm';
import { Task } from './task.entity';
import { TaskStatus } from './task-status.enum';
import { CreateTaskDto } from './dto/create-task.dto';

@Injectable()
export class TasksService {
constructor(
@InjectRepository(TasksRepository)
private taskRepository: TasksRepository,
) {}


async getTaskById(id: string): Promise<Task> {
const found = await this.taskRepository.findOneBy({ id: id });
if (!found) {
  throw new NotFoundException(`Task with ID "${id}" not 
found`);
  }

return found;
  }
}
node.js postgresql nestjs typeorm repository-pattern
2个回答
0
投票

很快,在您的存储库中,您缺少实体管理器,您需要提供一个在自定义存储库构造函数中调用

super()
的实体管理器。

有多种方法可以实现,这些可以在 typeorm 文档和 Nestjs 文档中找到:

  1. https://typeorm.io/custom-repository
  2. https://docs.nestjs.com/techniques/database#repository-patternhttps://docs.nestjs.com/techniques/database#repository-pattern
  3. 坚持使用自定义存储库,并且可以在互联网上搜索和找到

我刚刚完成从 typeorm

0.2.45
0.3.11
再到
@nestjs/typeorm
9.0.1
的迁移。

我们的代码库由 70 多个自定义存储库组成,这些存储库用于许多地方:服务、测试、种子、修复(例如自定义迁移)... 出于这个原因,现在我们坚持使用自定义类存储库(像以前一样),尽管我不确定这是否可行。至少应用程序似乎可以工作,测试正在通过。但一旦我们在社区中获得更多反馈,也许我们会迭代更新内容 - 哪些是首选方式,哪些不是(以及原因)。

App.module.ts

TypeOrmModule.forRootAsync({
      useFactory: async (appConfig: ConfigService) => ({
        type: 'postgres',
        ...config.database,
        entities: [`${__dirname}/modules/**/*.entity{.ts,.js}`],
      }),
      dataSourceFactory: async (dataSourceOptions) => {
        const dataSource = await new DataSource(dataSourceOptions).initialize();
        return dataSource;
      },
      inject: [ConfigService],
    }),

存储库.ts

@Injectable()
export class UserRepository extends Repository<User> {
  constructor(private readonly emanager: EntityManager) {
    super(User, emanager);
  }
  // down we have custom logic-methods...

用户.service.ts

export class UserService {
  constructor(
    private readonly dataSource: DataSource,
    private readonly userRepo: UserRepository,

用户.module.ts

@Module({
  imports: [
    TypeOrmModule.forFeature([User]),
    ...
  ],
  controllers: [UserController],
  providers: [UserService, UserRepository],
  exports: [UserService],
})
export class UserModule {}

最后,非常重要的是,里面的交易伪代码

user.service.ts

await this.dataSource.transaction(async (tManager) => {
   const userRepo = new UserRepository(tManager);
   ...

我分享这个主要是为了从社区获得(坏的或好的)反馈。


0
投票

您还可以更新您的配置文件以包含以下内容(如果它像我的一样,仅引用 .ts 扩展名)

实体:[__dirname + '/../**//.entity{.ts,.js}'],

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