GraphQL:对象名称在解析器中定义,但不在架构中定义

时间:2018-04-23 21:45:29

标签: graphql apollo

我想用graphql定义一个变种。

我的变异是将对象作为参数。所以我使用GraphQLObjectType在模式和解析器中定义了新的Object。

但是我收到了这个错误:

  

错误:在解析程序中定义了Agreement.name,但在架构

中没有

有什么想法吗?

这是我的架构定义

const typeDefs = `

    type Agreement {
        id: Int
    }

    type Mutation {
        agreementsPost(agreement: Agreement) : String
    }
`;

这是我的解析器:

const appResolvers = {

    Agreement: new GraphQLObjectType({
        name: 'Agreement',
        fields: {
            id: { type: GraphQLInt },
        }
    }),
Mutation: {

       agreementsPost(root, args) {
            return axios.post("....").then(res => res.data);
        },
    }

4 个答案:

答案 0 :(得分:6)

这里要解决的事情很多。首先,要将对象用作参数,您必须在模式中将其定义为input(或GraphQLInputObjectType) - 您不能使用常规type(或{{1 }})作为参数。

所以你的类型定义需要看起来像这样:

GraphQLObjectType

如果您已经拥有type Mutation { agreementsPost(agreement: Agreement): String } input Agreement { id: Int } 类型,则需要将输入命名为其他内容。将Agreement附加到您的类型名称是一个很好的惯例:

Input

这应该足以允许您传入type Mutation { agreementsPost(agreement: AgreementInput): String } type Agreement { id: Int } input AgreementInput { id: Int } 对象作为突变的参数。您无需向解析器添加AgreementInputAgreement(实际上,GraphQL未对输入进行“解析”,因此无法为输入添加解析器。)

也就是说,你的解析器对象不需要包含AgreementInput包提供的任何类型构造函数 - 当你调用时,Apollo会为你的解析器构造一个graphql对象并为你定义类型定义GraphQLSchema

如果您的类型定义包含makeExecutableSchemaFoo类型,那么您的Bar对象可能如下所示:

resolvers

注意const resolvers = { Foo: { someFooProperty: (foo, args, context, info) => {} }, Bar: { someBarProperty: (bar, args, context, info) => {} someOtherBarProperty: (bar, args, context, info) => {} }, Query: { someQuery: (root, args, context, info) => {} }, Mutation: { someMutation: (root, args, context, info) => {} }, } 对象中的每个属性如何匹配模式中定义的类型之一(包括查询和变异)。每个属性的值本身就是一个对象,每个属性映射到为该特定类型定义的字段之一。每个字段的值都是您的resolvers函数。

您看到错误的原因是您已经有效地告诉resolve将解析器添加到协议类型的两个字段 - makeExecutableSchemaname - 根据您的类型定义,它实际上在您的架构中。

您可以阅读有关如何使用Apollo here生成架构的更多信息。您可能会看到通过定义GraphQLSchema对象并将其传递到中间件而使用GraphQL.js“以编程方式”生成模式的示例。这两种方法都有利有弊,但使用fields通常更容易,更不容易出错。无论哪种方式,知道如何以编程方式生成模式是件好事,但是你不应该将它们混合在一起!

答案 1 :(得分:1)

在我的情况下,发生这种情况是因为架构中的非null不一致。在我的突变中,我没有非空突变,而在对象模式中,我没有非空突变。

答案 2 :(得分:1)

其他数据(与错误有关-与Q代码无关)。

hello-world

我们在地图中定义了我们的解析器, 键对应与我们架构的类型。 https://www.apollographql.com/docs/tutorial/resolvers/

“错误地图”错误的最基本的“ hello world” 示例。

我在目的上是错误的(在解析程序定义下-使用hello2而不是hello)。

graphql-yoga服务器示例:

/*index.js*/
const { GraphQLServer } = require('graphql-yoga')

const typeDefs = `
  type Query {
    hello(name: String): String!
  }
`

const resolvers = {
  Query: {
    hello2: (_, { name }) => `Hello ${name || 'World'}`,
  },
}

const server = new GraphQLServer({ typeDefs, resolvers })
server.start(() => console.log('Server is running on localhost:4000'))

抛出错误:

[错误:在解析程序中定义的Query.hello2,但在架构中未定义]

解析器更改为hello(与hello模式类型匹配)以解决此错误:

enter image description here

相关

答案 3 :(得分:0)

我从apollo-server-express的v1迁移到v2时遇到了此错误,该错误与未在架构中定义上载有关。现在,在声明graphql模式时,可以使用选项集uploads: false

// GraphQL: Schema
const SERVER = new ApolloServer({
  typeDefs: typeDefs,
  resolvers: resolvers,
  introspection: true,
  uploads: false,
  playground: {
    endpoint: `http://localhost:3000/graphql`,
    settings: {
      'editor.theme': 'light'
    }
  }
});

如果您的错误是Uploads特定的,则在这种情况下似乎可以解决问题