热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《GraphQL:对象名称在解析器中定义,但不在架构中定义》经验,为你挑选了1个好方法。

我想用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);
        },
    }

Daniel Reard.. 7

有几件事要在这里解决.首先,要将对象用作参数,必须将其定义为模式中的input(或GraphQLInputObjectType) - 不能使用常规type(或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
}

这应该足以允许您将AgreementInput对象作为参数传递给您的变异.您不需要添加AgreementAgreementInput解析您的解析器(实际上,GraphQL没有"解析"输入,因此无法为输入添加解析器).

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

如果你的类型定义包括类型FooBar,你的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功能.

您看到的错误的原因是您已经有效地告诉makeExecutableSchema您将协议转换器添加到协议类型的两个字段 - name而且fields- 根据您的类型定义,这两个字段实际上都不在您的架构中.

您可以在此处阅读有关如何使用Apollo生成模式的更多信息.您可能会看到通过定义GraphQLSchema对象并将其传递到中间件而使用GraphQL.js"以编程方式"生成模式的示例.两种方法都有利有弊,但使用makeExecutableSchema通常更容易,更不容易出错.无论哪种方式,最好知道如何以编程方式生成模式,但不要混淆两者!



1> Daniel Reard..:

有几件事要在这里解决.首先,要将对象用作参数,必须将其定义为模式中的input(或GraphQLInputObjectType) - 不能使用常规type(或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
}

这应该足以允许您将AgreementInput对象作为参数传递给您的变异.您不需要添加AgreementAgreementInput解析您的解析器(实际上,GraphQL没有"解析"输入,因此无法为输入添加解析器).

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

如果你的类型定义包括类型FooBar,你的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功能.

您看到的错误的原因是您已经有效地告诉makeExecutableSchema您将协议转换器添加到协议类型的两个字段 - name而且fields- 根据您的类型定义,这两个字段实际上都不在您的架构中.

您可以在此处阅读有关如何使用Apollo生成模式的更多信息.您可能会看到通过定义GraphQLSchema对象并将其传递到中间件而使用GraphQL.js"以编程方式"生成模式的示例.两种方法都有利有弊,但使用makeExecutableSchema通常更容易,更不容易出错.无论哪种方式,最好知道如何以编程方式生成模式,但不要混淆两者!


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文整理了Java中org.apache.pig.backend.executionengine.ExecException.<init>()方法的一些代码 ... [详细]
author-avatar
手机用户2502880437
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有