NodeJS TypeError:无法读取未定义的属性“findOneBy”

kkbh8khc  于 2022-12-29  发布在  Node.js
关注(0)|答案(1)|浏览(207)

x1c 0d1x我是Nestjs的新手,在使用这些版本的typeOrm“@nestjs/typeorm”时:“^9.0.1”,“类型标准”:“^0.3.11”,我收到此错误“类型错误:无法读取未定义“”的属性“findOneBy”,我真的不明白为什么。因此,我了解到findOne已被弃用,我可以使用findByOne代替。但每次我尝试使用postman进行测试时,我都会遇到此错误。附件是下面终端中的错误。如果您能提供任何有关如何解决此问题的帮助,我将不胜感激
我试过将typeorm的版本更改为较低的版本“^0.2.32”,它修复了错误,但在运行它时引入了另一个错误。但我想使用我在网上搜索的更新版本,看看我是否能找到任何帮助,但没有与我的问题相关的。
这是我的代码。另外,我注意到EntityRepository被删除了,因为它已被弃用。
tasks.repository

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);
}

}
tasks.service

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;
  }
}
u3r8eeie

u3r8eeie1#

不久,在您的存储库中,您缺少实体管理器,您需要提供一个在自定义存储库构造函数中调用super()的实体管理器。
有几种方法可以帮助你,这些方法可以在typeorm文档和nestjs文档中找到:

  1. https://typeorm.io/custom-repository
  2. https://docs.nestjs.com/techniques/database#repository-pattern and https://docs.nestjs.com/techniques/database#repository-pattern
    1.坚持使用自定义存储库,并且可以在互联网上搜索和找到
    我刚刚完成从typeorm 0.2.450.3.11@nestjs/typeorm9.0.1的迁移。
    我们的代码库由70多个自定义存储库组成,这些存储库在许多地方使用:服务、测试、种子、修复(类似于自定义迁移)......出于这个原因,现在我们坚持使用自定义类仓库(和以前一样),尽管我不确定这是否是一条路。至少应用程序看起来可以工作,测试正在通过。但也许我们会在迭代中更新东西,一旦我们在社区中得到更多的反馈--哪些是首选的方式,哪些不是(以及为什么)。
    • 应用程序模块. 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...
    • 用户服务ts**
export class UserService {
  constructor(
    private readonly dataSource: DataSource,
    private readonly userRepo: UserRepository,
    • 用户模块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);
   ...

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

相关问题