如何将 typescript automapper(nartc/mapper) 与 Prisma js 一起使用?

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

我尝试使 PrismaAutomapper 一起使用(以便能够将模型映射到 Dtos 并返回)。 Prisma 有

schema.prisma
我们定义模型的地方,模型会自动为我们生成.. 但是它们生成时我们无法修改它们但是我们需要,因为automapper需要添加装饰器使自动映射工作。那么,Prisma 与 automapper 一起使用是不是不可能呢?谢谢!

javascript typescript orm automapper prisma
1个回答
0
投票

解决方案的关键在于一个两步过程,我们首先将 Prisma 模型转换为更可变的格式,可以根据需要进行装饰或操作,然后利用 AutoMapper 处理从这些适应模型到所需 DTO 的映射。这种方法使用

plainToInstance
包中的
class-transformer
函数将 Prisma 模型转换为类实例,然后可以对其进行增强或修饰。完成此转换后,可以使用 AutoMapper 将这些实例映射到 DTO。

分步指南

第 1 步:将 Prisma 模型转换为类实例

我们需要创建反映 Prisma 模型结构的实体类。这些类将充当中介,允许我们附加装饰器或执行操作。

// user.entity.ts
import { AutoMap } from '@automapper/classes';

export class UserEntity {
  @AutoMap()
  id: number;

  @AutoMap()
  name: string;

  @AutoMap()
  email: string;
}

接下来,我们使用

plainToInstance
中的
class-transformer
将 Prisma 的普通对象转换为
UserEntity
类的实例。

import { plainToInstance } from 'class-transformer';
import { UserEntity } from './user.entity';
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function findUserById(id: number): Promise<UserEntity> {
  const user = await prisma.user.findUnique({ where: { id } });
  return plainToInstance(UserEntity, user);
}

第 2 步:使用 AutoMapper 映射到 DTO

现在我们在

UserEntity
的实例中拥有了 Prisma 模型数据,我们可以使用 AutoMapper 轻松地将其映射到
UserDto
。首先,确保您的 AutoMapper 配置文件设置为从
UserEntity
映射到
UserDto

// automapper.profile.ts
import { ProfileBase } from '@automapper/classes';
import { UserDto } from './user.dto';
import { UserEntity } from './user.entity';

export class UserProfile extends ProfileBase {
  constructor(mapper) {
    super();
    mapper.createMap(UserEntity, UserDto);
  }
}

然后,您可以在服务层或任何需要转换数据的地方执行映射。

// userService.ts
import { AutoMapper } from '@automapper/classes';
import { UserDto } from './user.dto';
import { findUserById } from './yourUserFinderFunction'; // This function uses plainToInstance

async function getUserDtoById(id: number, mapper: AutoMapper): Promise<UserDto> {
  const userEntity = await findUserById(id);
  return mapper.map(userEntity, UserDto, UserEntity);
}

通过使用

plainToInstance
将这些模型转换为类实例,我们可以有效地利用AutoMapper将这些实例映射到DTO。这种方法可以保持数据层的完整性,同时利用强大的映射功能,遵循软件设计和架构的最佳实践。

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