棱镜:类型“字符串”不可分配给类型“从不”
Posted
技术标签:
【中文标题】棱镜:类型“字符串”不可分配给类型“从不”【英文标题】:prisma: Type 'string' is not assignable to type 'never' 【发布时间】:2021-12-04 12:31:28 【问题描述】:THIS IS THE ACTUAL ERROR
这是我的 DTO
export class CreateGradeDto
id: string;
first_bimester?: number;
second_bimester?: number;
third_bimester?: number;
fourth_bimester?: number;
studentId: never;
classId: string;
createdAt: Date;
updatedAt: Date;
这是我的棱镜模型
model Grades
id String @id @unique
first_bimester Float
second_bimester Float
third_bimester Float
fourth_bimester Float
student Student @relation(fields: [studentId], references: [id])
studentId String @unique
class Classes @relation(fields: [classId], references: [id])
classId String @unique
createdAt DateTime @default(now())
updatedAt DateTime @default(now())
这是学生模型
export class CreateStudentDto
id: string;
name: string;
cpf: string;
createdAt: Date;
updatedAt: Date;
(这个项目我用的是nestjs)
我不知道为什么我不能保存成绩,即使知道 ID 一直保存为字符串。我还检查了真正的 postgre 数据库,它们被保存为字符串。
有人可以帮帮我吗?
【问题讨论】:
你是在app中设置id而不是db吗? 是的,我使用 uuid lib 中的 v4 来创建 id 你应该有一个映射层,不要只是将dto传递给db(出于各种原因)。看起来 prisma 会根据模型模式为您生成类型,这就是类型不匹配的原因。有关示例,请参见 here。 我认为您需要创建该模型的新实例,将 dto 中的值映射到该实例,然后将该新实例传递给 create 方法。或者,如果您希望它快速而肮脏,您的 dto 可以扩展该类型。 我认为最好的做法是像这样直接发送 dto。谢谢你的帮助,我试试看。 【参考方案1】:我最初无法弄清楚如何创建记录并将其与现有记录相关联。我遇到了和你一样的错误(好吧,number is not assignable to type never
因为我的 ID 是数字)。
然后我在这里找到了文档的相关部分:https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries/#connect-an-existing-record - 它不完全是前面和中心。您的情况下的语法类似于:
prisma.grade.create(
data:
student: connect: id: 'your-student-id' ,
// ... rest of the grade data
,
);
所以,是的,您需要进行某种映射以将 DTO 中的关系字段转换为上述语法。比如:
// Create a copy of the dto data without the foreign key fields. Using lodash here for brevity
const gradeData = _.omit(createGradeDto, ['studentId', 'classId']);
prisma.grade.create(
data:
...gradeData,
student: connect: id: createGradeDto.studentId ,
class: connect: id: createGradeDto.classId ,
,
);
【讨论】:
无 lodash 版本:const studentId, classId, ...gradeData = createGradeDto
以上是关于棱镜:类型“字符串”不可分配给类型“从不”的主要内容,如果未能解决你的问题,请参考以下文章