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

Apollo/GraphQl-类型必须是输入类型

如何解决《Apollo/GraphQl-类型必须是输入类型》经验,为你挑选了1个好方法。

当我在学习过程中将Apollo和graphQL集成到我的一个项目中时,所有人都会接触到你们.到目前为止它还可以,但现在我想尝试一些突变,我正在努力使用Input类型和Query类型.我觉得它比它应该更复杂,因此我正在寻找关于如何管理我的情况的建议.我在网上找到的例子总是有非常基本的模式,但实际情况总是比较复杂,因为我的模式很大,看起来如下(我只复制一部分):

type Calculation {
    _id: String!
    userId: String!
    data: CalculationData
    lastUpdated: Int
    name: String
}

type CalculationData {
    Loads: [Load]
    validated: Boolean
    x: Float
    y: Float
    z: Float
    Inputs: [Input]
    metric: Boolean

}

然后定义输入和加载,依此类推......

为此,我想要一个变种来保存"计算",所以在同一个文件中我有这个:

type Mutation {
    saveCalculation(data: CalculationData!, name: String!): Calculation
}

我的解析器如下:

export default resolvers = {
    Mutation: {
        saveCalculation(obj, args, context) {
            if(context.user && context.user._id){
                const calculatiOnId= Calculations.insert({
                    userId: context.user._id,
                    data: args.data,
                    name: args.name
                })
                return Calculations.findOne({ _id: calculationId})
            }
            throw new Error('Need an account to save a calculation')
        }
    }
}

然后我的变异如下:从'graphql-tag'导入gql;

export const SAVE_CALCULATION = gql`
    mutation saveCalculation($data: CalculationData!, $name: String!){
        saveCalculation(data: $data, name: $name){
            _id
        }
    }
`

最后我使用Mutation组件尝试保存数据:


    {(saveCalculation, { data }) => (
        
saveCalculation({ variables : { data: this.state, name:'name calcul' }})}>SAVE
}}

现在我收到以下错误:

[GraphQL错误]:消息:Mutation.saveCalculation(data :)的类型必须是输入类型但得到:CalculationData!.,Location:undefined,Path:undefined

从我的研究和其他一些SO帖子中,除了Query类型之外我还应该定义输入类型,但是输入类型只能是标量类型,但我的模式依赖于其他模式(这不是标量).我可以根据其他输入类型创建输入类型,等等,当最后一个只有标量类型时?我有点失落,因为它似乎有很多冗余.非常感谢对最佳实践的一些指导.我确信Apollo/graphql可以在我的项目中为我提供很好的帮助,但我不得不承认,当Schemas有点复杂时,它比我想要的更复杂.在线示例通常坚持使用String和Boolean.



1> Daniel Reard..:

从规格:

字段可以接受参数来配置其行为.这些输入通常是标量或枚举,但有时需要表示更复杂的值.

GraphQL输入对象定义一组输入字段; 输入字段是标量,枚举或其他输入对象.这允许参数接受任意复杂的结构.

换句话说,您不能使用常规GraphQLObjectTypes作为GraphQLInputObjectType字段的类型- 您必须使用另一个GraphQLInputObjectType.

使用SDL编写模式时,必须创建Load类型和LoadInput输入似乎是多余的,特别是如果它们具有相同的字段.但是,在引擎盖下,您定义的类型和输入将变为非常不同的对象类,每个类具有不同的属性和方法.有一种特定于GraphQLObjectType(如接受参数)的功能,它们不存在GraphQLInputObjectType- 反之亦然.

试图用来代替另一个有点像试图在圆孔中放一个方形钉."我不知道为什么我需要一个圆圈.我有一个正方形.它们都有直径.为什么我需要两个?"

除此之外,将类型和输入分开是一个很好的实际原因.这是因为在很多情况下,您将在输入上不会暴露的类型上暴露大量字段.

例如,您的类型可能包含实际上是基础数据组合的派生字段.或者它可能包括与其他数据关系的friends字段(如a上的字段User).在这两种情况下,将这些字段作为某些字段的参数提交的数据的一部分是没有意义的.同样,您可能有一些输入字段,您不希望在其类型对应项上公开(一个password字段会浮现在脑海中).


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
author-avatar
vaaal52653
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有