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()
}
这样可以吗?也就是说,datamodel
和schema
中的同一个字段有不同的类型?它似乎工作正常,但我不知道在其他情况下遵循此技术是否会让自己在路上遇到麻烦。
如果是这样,我很好奇的一件事是为什么在 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!
。
我是 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()
}
这样可以吗?也就是说,datamodel
和schema
中的同一个字段有不同的类型?它似乎工作正常,但我不知道在其他情况下遵循此技术是否会让自己在路上遇到麻烦。
如果是这样,我很好奇的一件事是为什么在 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!
。