【问题标题】:GraphQL Error : Field is not defined in the input typeGraphQL 错误:输入类型中未定义字段
【发布时间】:2020-01-09 03:03:33
【问题描述】:

我的申请中有错误。我使用 Next.js / ApolloClient / GraphQL 和 Prisma。该错误与 GraphQL 架构有关,它在 Mutation 中使用:

错误:原因:“end_date”字段“end_date”未在 输入类型 ArticleCreateInput

我尝试在每个文件上复制/粘贴全局架构以获得良好的对应数据,但它不起作用。

我的数据模型(datamodel.prisma):

type Article {
  id: ID! @id
  title: String!
  description: String!
  createdAt: DateTime! @createdAt
  updatedAt: DateTime! @updatedAt
  image: String
  maxUserNumber: Int!
  greatImage: String
  street: String!
  begin_date: DateTime!
  end_date: DateTime!
  price: Int!
  user: User!
}

我的 schema.graphql:

createArticle(
    title: String!
    description: String!
    image: String
    maxUserNumber: Int!
    greatImage: String
    street: String!
    begin_date: DateTime!
    end_date: DateTime!
    price: Int!
  ): Article!

在我的生成文件 (prisma.graphql) 中:

input ArticleCreateInput {
  id: ID
  title: String!
  description: String!
  image: String
  maxUserNumber: Int
  greatImage: String
  street: String
  begin_date: DateTime
  end_date: DateTime
  price: Int!
  user: UserCreateOneInput!
}

客户端突变和状态:

const CREATE_ARTICLE_MUTATION = gql`
  mutation CREATE_ARTICLE_MUTATION(
    $title: String!
    $description: String!
    $image: String
    $maxUserNumber: Int!
    $greatImage: String
    $street: String!
    $begin_date: DateTime!
    $end_date: DateTime!
    $price: Int!
  ) {
    createArticle(
      title: $title
      description: $description
      image: $image
      maxUserNumber: $maxUserNumber
      greatImage: $greatImage
      street: $street
      begin_date: $begin_date
      end_date: $end_date
      price: $price
    ) {
      id
    }
  }
`;
export class CreateArticle extends Component {
  state = {
    adresse: "",
    title: "",
    description: "",
    image: "",
    greatImage: "",
    price: 0,
    nbPersons: 2,
    loadigImg: false,
    begin_date: moment(new Date(Date.now())).format("YYYY-MM-DD"),
    end_date: moment(new Date(Date.now()))
      .add(1, "days")
      .format("YYYY-MM-DD")
  };

使用 Mutation 调用:

 <Mutation
        mutation={CREATE_ARTICLE_MUTATION}
        variables={{
          ...this.state,
          maxUserNumber: this.state.nbPersons,
          street: this.state.adresse
        }}
      >

还有后端变异:

async createArticle(parent, args, ctx, info) {

    if (!ctx.request.userId) {
      throw new Error("Vous devez être connecté");
    }


    const article = await ctx.db.mutation.createArticle(
      {
        data: {
          user: {
            connect: {
              id: ctx.request.userId
            }
          },
          ...args
        }
      },
      info
    );

    return article;
  },

当我使用我的 createArticle 突变时,我有一个指定的错误:

原因 'end_date' 字段未在类型中定义 ArticleCreateInput

但是,当我在我的变异中记录 args 时,我拥有所有字段!

【问题讨论】:

  • 你也可以添加你正在使用的突变逻辑吗?客户端也是:)
  • 我在上面的描述中添加了这个。感谢您的帮助
  • GraphQL 默认将标识符转换为驼峰式。这很可能是你的问题。开始日期,结束日期 -> 开始日期,结束日期

标签: reactjs graphql field apollo prisma


【解决方案1】:

据我了解,这是一个 graphql 运行时问题,因此请尝试将 DateTime 类型临时替换为字符串或数字(如果您依赖于纪元)。一个可能的问题是您正在使用这个非标准的 DateTime 标量,这意味着您需要一个解析器来转换这个 custom type,阿波罗将使用它来序列化它。如果由于某种原因此转换器损坏,它可能会返回 null 或 undefined,这会产生您确实遇到的错误。

【讨论】:

    【解决方案2】:

    根据错误消息,您似乎忘记将 Article 模型与另一个相关模型进行引用。在 Prisma 中,您可以使用类似于以下内容的内容:references: [id] 并在 GraphCMS 的 Add Field 菜单上找到 Reference 按钮右上角。

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 2020-06-01
      • 2016-10-14
      • 2018-01-30
      • 2018-09-06
      • 2020-03-21
      • 2017-08-16
      • 2019-09-19
      • 2020-08-29
      相关资源
      最近更新 更多