我是Prisma / GraphQL的新手。我正在编写一个简单的ToDo应用,并将Apollo Server 2和Prisma GraphQL用于后端。我想将createdAt
字段从数据模型转换为前端更有用的东西,例如UTC日期字符串。我的想法是转换存储的值,即DateTime。
我的datamodel.prisma
的ToDo类型具有以下内容
type ToDo {
id: ID! @id
added: DateTime! @createdAt
body: String!
title: String
user: User!
completed: Boolean! @default(value: false)
}
added
字段是一个DataTime。但是在我的schema.js
中,我将该字段列为字符串
type ToDo {
id: ID!
title: String,
added: String!
body: String!
user: User!
completed: Boolean!
}
然后我在解析器中将其转换
ToDo: {
added: async (parent, args) => {
const d = new Date(parent.added)
return d.toUTCString()
}
可以这样做吗?也就是说,datamodel
和schema
中相同字段的类型不同吗?看来效果不错,但我不知道是否在其他情况下也采用这种技术,是否愿意开放自己来解决问题。
如果是这样,我很好奇的是为什么在parent.added
解析器中访问ToDo.added
不会启动某种“无限循环”-即,当您访问parent.added
字段,它不会使用解析器来解析访问parent.added
字段的字段,依此类推。 (我猜这足够聪明了,可以不这样做吗?)
答案 0 :(得分:1)
我在Prisma方面的经验有限,但我了解您可以将其视为自己的GraphQL服务器与数据(即数据库)之间的额外后端GraphQL层。
您的第一个模型(datamodel.prisma
)使用增强的Prisma语法和指令来准确地描述您的数据,并被Prisma层使用,而第二个模型则使用标准的GraphQL语法来实现有效的同一对象,标准GraphQL类型,供您自己的后端使用。
实际上,如果您仔细研究一下,就会发现Prisma使用的DateTime
类型实际上是String
,但是Prisma可能会使用它来验证日期和时间格式等。 ,因此两个模型之间没有根本的差异。但是,即使存在差异,也要由您决定,因为您可以使用解析器覆盖从Prisma获取的数据,然后再从自己的后端返回数据。
简而言之,我想在这里说的是,您正在处理2个不同的GraphQL层:Prisma和您自己的。虽然Prisma的作用是准确地表示数据库中存在的数据,并为您提供广泛的CRUD方法集合以处理该数据,但您的层可以(并且应该)适合您的特定需求。>
对于您的解析器问题,在此上下文中,parent
将保留父解析器返回的对象。假设您在根getTodo
级别有一个Query
查询,返回单个类型ToDo
的项目。假设您将其解析为Prisma的默认操作以检索单个ToDo。根据您的datamodel.prisma
文件,此查询将解析为具有added
属性的对象(该属性将在createdAt
字段中存在,如{{1}所指定) } Prisma指令)。因此@createdAt
将保留该值。
您的parent.added
解析器的作用是将原始数据转换为实际的Date对象,然后将其格式化为UTC字符串,该字符串与您的added
文件一致,其中{{ 1}}字段的类型为schema.js
。