Remix有一个名为独立堆栈的示例repohttps://github.com/remix-run/indie-stack.我对前端开发很陌生,以前从未真正使用过TS、react或prisma。
我正在查看https://github.com/remix-run/indie-stack/blob/main/app/models/note.server.ts文件,并试图通过尝试使用getNote
函数作为示例,以及prisma的文档,找出如何编写一个函数,在给定新标题和正文的情况下更新注释:https://www.prisma.io/docs/concepts/components/prisma-client/crud#update
export function updateNote({
id,
body,
title,
userId,
}: Pick<Note, "body" | "title" | "id"> & { userId: User["id"] }) {
return prisma.note.update({
where: { id, userId },
data: {
title,
body,
},
});
}
typescript不喜欢where: { id, userId}
,这让我很困惑,因为它被用于get和delete函数。
Type '{ id: string; userId: string; }' is not assignable to type 'NoteWhereUniqueInput'.
Object literal may only specify known properties, and 'userId' does not exist in type 'NoteWhereUniqueInput'.ts(2322)
index.d.ts(3448, 5): The expected type comes from property 'where' which is declared here on type '{ select?: NoteSelect | null | undefined; include?: NoteInclude | null | undefined; data: (Without<NoteUpdateInput, NoteUncheckedUpdateInput> & NoteUncheckedUpdateInput) | (Without<...> & NoteUpdateInput); where: NoteWhereUniqueInput; }'
如果能解释一下为什么我的函数是错误的,以及我应该如何写它,我将不胜感激。
-谢谢。
更新:由于4.5,似乎可以使用非唯一字段,请参阅发行说明中的详细信息。
您正在调用Prismaupdate
API(链接可能无法指向update
部分,请单击右侧导航中的"更新"(。
API希望*WhereUniqueInput
类型作为输入,这里是文档的相关部分:
包装模型的所有唯一字段,以便可以选择单个记录。
Note
模型具有以下定义(删除了非重要部分(:
model Note {
id String @id @default(cuid())
userId String
}
因此,id
是主键,因此它是唯一的,但userId
只是一个没有@unique
装饰器的字段,而不是主键,因此,它不能是update
API调用中where
的一部分。
但你真的需要它吗?你的应用程序似乎是为了更新属于当前用户的笔记,所以不需要更新userId
,而id
已经明确标识了特定的笔记。我认为你的功能应该是这样的:
export function updateNote({
id,
body,
title,
}: Pick<Note, "body" | "title" | "id">) {
return prisma.note.update({
where: { id },
data: {
title,
body,
},
});
}