Prisma GraphQL模式和数据模型之间的同一字段可以具有不同的类型吗?

时间:2019-05-02 13:24:47

标签: graphql apollo-server prisma prisma-graphql

我是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()
    }

可以这样做吗?也就是说,datamodelschema中相同字段的类型不同吗?看来效果不错,但我不知道是否在其他情况下也采用这种技术,是否愿意开放自己来解决问题。

如果是这样,我很好奇的是为什么在parent.added解析器中访问ToDo.added不会启动某种“无限循环”-即,当您访问parent.added字段,它不会使用解析器来解析访问parent.added字段的字段,依此类推。 (我猜这足够聪明了,可以不这样做吗?)

1 个答案:

答案 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

相关问题