为GraphQL Yoga提供的Prisma声明字段的正确方法,但在解析程序中则不需要

时间:2018-09-04 20:47:37

标签: graphql prisma

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

我遇到这样的情况,我的前端使用字段createPosting向我的GraphQL-Yoga服务器上的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在“突变”下具有此名称:

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类型时,我发现字段createdAt!在这两个地方。

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

如果有人可以向我指出错误的正确方向,或者让我更好地了解如何设置应该存储在数据库中但在我的Yoga-server中创建的变量,而不是在前端-结束,我将非常感激:)

尽管这个问题似乎有点具体,但我认为在创建节点之前应该可以在服务器上为字段创建数据的想法,但此刻我正在竭尽全力。

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

1 个答案:

答案 0 :(得分:3)

好吧,经过大量尝试不同策略的工作之后,我终于尝试将字段名称从createdAt更改为createdDate,并且现在可以使用。

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

错误消息Reason: 'createdAt' Field 'createdAt' is not defined in the input type 'PostingCreateInput'.肯定没有以任何方式将我指向正确的方向。

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