我是 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;
}
}
很快,在您的存储库中,您缺少实体管理器,您需要提供一个在自定义存储库构造函数中调用
super()
的实体管理器。
有多种方法可以实现,这些可以在 typeorm 文档和 Nestjs 文档中找到:
我刚刚完成从 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);
...
我分享这个主要是为了从社区获得(坏的或好的)反馈。
您还可以更新您的配置文件以包含以下内容(如果它像我的一样,仅引用 .ts 扩展名)
实体:[__dirname + '/../**//.entity{.ts,.js}'],