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

Can one have different types for same field between Prisma GraphQL schema and datamodel?

我是 Prisma/GraphQL 的新手。我正在编写一个简单的 ToDo 应用程序,并在后端使用 Apollo Server 2 和 Prisma GraphQL。我想将我的 createdAt 字段从数据模型转换为在前端更有用的东西,比如 UTC 日期字符串。我的想法是转换存储的值,这是一个日期时间。

我的 datamodel.prisma 有以下 ToDo 类型

type ToDo {
id: ID! @id
added: DateTime! @createdAt
body: String!
title: String
user: User!
completed: Boolean! @default(value: false)

}

added 字段是一个数据时间。但是在我的 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中的同一个字段有不同的类型?它似乎工作正常,但我不知道在其他情况下遵循此技术是否会让自己在路上遇到麻烦。

如果是这样,我很好奇的一件事是为什么在 ToDo.added 解析器中访问 parent.added 不会启动某种 'infinite loop' —— 也就是说,当您访问 parent.added 字段,它不会让解析器解析该字段,解析器访问 parent.added 字段,依此类推。 (我想它只是足够聪明,不那样做?)

我对 Prisma 的经验有限,但我知道你可以将其视为一个额外的 back-end GraphQL 层,连接你自己的 GraphQL 服务器和你的数据(即数据库)。

您的第一个模型 (datamodel.prisma) 使用增强的 Prisma 语法和指令来准确描述您的数据,并由 Prisma 层使用,而第二个模型使用标准的 GraphQL 语法来实现与有效的标准 GraphQL 类型,由您自己使用 back-end.

实际上,如果您查看它,您会发现 Prisma 使用的 DateTime 类型实际上是 String,但 Prisma 可能使用它来验证日期和时间格式,等,因此两种模型之间没有根本差异。但即使存在差异,这也取决于您,因为您可以使用解析器覆盖从 Prisma 获得的数据,然后再从您自己的 back-end.

返回数据

简而言之,我在这里想说的是,您正在处理 2 个不同的 GraphQL 层:Prisma 和您自己的。虽然 Prisma 的作用是准确地表示您的数据,因为它存在于数据库中,并为您提供广泛的 CRUD 方法集合来处理该数据,您自己的层可以(并且应该)根据您的特定需求进行定制。

至于您的解析器问题,parent 在此上下文中将保存父解析器返回的对象。假设您在根 Query 级别有一个 getTodo 查询,返回类型为 ToDo 的单个项目。假设您将此解决为 Prisma 的默认操作以检索单个 ToDo。根据您的 datamodel.prisma 文件,此查询将解析为具有 added 属性 的对象(它将作为 createdAt 字段存在于您的数据库中,如@createdAt Prisma 指令)。所以 parent.added 将保留该值。

您的 added 解析器所做的是将原始数据转换为实际的 Date 对象,然后将其格式化为 UTC 字符串,该字符串符合您的 schema.js 文件,其中added 字段的类型为 String!