正确声明 GraphQL Yoga 提供的 Prisma 字段但在解析器中不需要的方法

Posted

技术标签:

【中文标题】正确声明 GraphQL Yoga 提供的 Prisma 字段但在解析器中不需要的方法【英文标题】:Correct way to declare fields for Prisma provided by GraphQL Yoga but not required in resolver 【发布时间】:2019-02-09 22:19:02 【问题描述】:

我一直试图在 Prisma 网站上找到一些关于此的文档,但老实说,在那里找到非常详细的用例有点困难,尤其是当问题像这个一样难以描述时。

我的前端向我的 GraphQL-Yoga 服务器上的 createPosting 发送突变请求,字段为 positionTitle, employmentType, description, requirements, customId, expiresAt(我已经彻底测试过它是否按预期工作)。我想在 Prisma 服务上创建节点之前添加一个createdAt 字段。

在我的 GraphQL-Yoga 服务器中,我有一个 datamodel.graphql,其中包括以下内容:

type Posting 
  id: ID! @unique
  customId: String! @unique
  offeredBy: Employer!
  postingTitle: String!
  positionTitle: String!
  employmentType: EmploymentType!
  status: PostingStatus!
  description: String
  requirements: String
  applications: [Application!]!
  createdAt: DateTime!
  expiresAt: DateTime!

我的 schema.graphql 在 Mutations 下有这个:

createPosting(postingTitle: String!,
    positionTitle: String!,
    employmentType: String!,
    description: String!,
    requirements: String!,
    customId: String!,
    expiresAt: DateTime!,
    status: PostingStatus): Posting!

最后,在我的 createPosting 解析器中,我尝试像这样改变 Prisma 后端:

const result = await context.prisma.mutation.createPosting(
    data: 
      offeredBy:  connect:  name: context.req.name ,
      postingTitle: args.postingTitle,
      positionTitle: args.positionTitle,
      employmentType: args.employmentType,
      description: args.description,
      requirements: args.requirements,
      customId: args.customId,
      createdAt: new Date().toISOString(),
      expiresAt: expiresAt,
      status: args.status || 'UPCOMING'
    
  )

当我尝试从前端运行它时,我在服务器上收到以下错误:

Error: Variable '$_v0_data' expected value of type 'PostingCreateInput!' but got: "customId":"dwa","postingTitle":"da","positionTitle":"da","employmentType":"PART_TIME","status":"UPCOMING","description":"dada","requirements":"dadada","expiresAt":"2018-09-27T00:00:00.000Z","createdAt":"2018-09-04T20:29:10.745Z","offeredBy":"connect":"name":"NSB". Reason: 'createdAt' Field 'createdAt' is not defined in the input type 'PostingCreateInput'.

从此错误消息中,我假设我的 Prisma 服务由于某种原因不知道 createdAt,因为我最近添加了此字段,但是当我在 Prisma 主机上的 GraphQL 操场中检查类型 Posting 和 PostingCreateInput 时,我发现字段创建在!在这两个地方。

我尝试删除生成的 prisma.graphql 并再次部署一个新文件,但没有奏效。当我检查 prisma.graphql 时,PostingCreateInput 确实错过了 createdAt 字段,即使 Prisma 服务器似乎有它。

如果有人可以为我指出错误的正确方向,或者让我更好地了解如何设置应该存储在数据库中但在我的瑜伽服务器中而不是在前面创建的变量-最后我会非常感激:)

虽然这个问题可能看起来有点具体,但我相信在创建节点之前应该可以在服务器上为字段创建数据的想法,但目前我正在努力思考如何做到这一点。

TLDR;在向我的 Prisma 服务发送创建请求之前,想要在解析器上的我的 GraphQL-Yoga 服务器上创建一个 createdAt:DateTime 字段。

【问题讨论】:

【参考方案1】:

好的,在尝试了不同的策略后,我终于尝试将字段名称从 createdAt 更改为 createdDate,现在它可以工作了。

当我浏览 Playground 时,我发现 createdAt 是 Prisma 本身在请求对查询进行排序时使用的半隐藏保护字段。它可以在单个数据条目的参数列表中的orderBy 选项下找到。

Reason: 'createdAt' Field 'createdAt' is not defined in the input type 'PostingCreateInput'. 的错误消息当然并没有为我指明正确的方向。

TLDR;问题是我将我的字段命名为 createdAt,这是一个受保护的字段名称。

【讨论】:

救了我,伙计! @Aquib 很高兴听到!如果库抛出错误或警告@_@,我会更喜欢它

以上是关于正确声明 GraphQL Yoga 提供的 Prisma 字段但在解析器中不需要的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭graphql-yoga服务器?

从 graphql yoga 返回状态码

graphql-yoga - GraphQL 解析器参数在哪里定义和记录?

带有graphql-yoga的子字段上的Graphql错误

在 graphql-yoga 中返回枚举的解析器函数是啥样的?

使用 Mongoose 和 graphql-yoga 实现分页