GraphQL 错误:输入类型中未定义字段

Posted

技术标签:

【中文标题】GraphQL 错误:输入类型中未定义字段【英文标题】:GraphQL Error : Field is not defined in the input type 【发布时间】: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 默认将标识符转换为驼峰式。这很可能是你的问题。开始日期,结束日期 -> 开始日期,结束日期 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于GraphQL 错误:输入类型中未定义字段的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Graphql 项目抛出错误:字段类型必须是输出类型但得到:未定义

如何自定义 GraphQL 查询验证错误消息

Graphql说未定义类型的验证错误

[GraphQL 错误]:消息:“rootMutation”类型的字段“createUser”上的未知参数“email”。位置:[object Object],路径:未定义

节点 - GraphQL - Ad.user 字段类型必须是输出类型,但得到:未定义

AWS AppSync GraphQL 输入验证 - 忽略额外字段?