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

2024-01-06

向大家致以我正在学习的过程,并将 Apollo 和 graphQL 集成到我的一个项目中。到目前为止一切顺利,但现在我正在尝试进行一些突变,并且在输入类型和查询类型方面遇到了困难。我觉得事情比应有的复杂得多,因此我正在寻求有关如何处理我的情况的建议。我在网上找到的示例总是具有非常基本的模式,但现实总是更复杂,因为我的模式相当大,如下所示(我将仅复制一部分):

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 组件来尝试保存数据:

<Mutation mutation={SAVE_CALCULATION}>
    {(saveCalculation, { data }) => (
        <div onClick={() => saveCalculation({ variables : { data: this.state, name:'name calcul' }})}>SAVE</div>
    }}
</Mutation>

现在我收到以下错误:

[GraphQL 错误]:消息:Mutation.saveCalculation(data:) 的类型 必须是输入类型,但得到:CalculationData!。,位置:未定义, 路径:未定义

从我的研究和其他一些 SO 帖子中,我知道除了查询类型之外,我还应该定义输入类型,但输入类型只能保存标量类型,但我的模式依赖于其他模式(而且不是标量)。当最后一个输入类型只有标量类型时,我可以根据其他输入类型等创建输入类型吗?我有点迷失了,因为这似乎有很多冗余。非常感谢有关最佳实践的一些指导。我深信阿波罗/graphql随着时间的推移,可以给我的项目带来很好的帮助,但我不得不承认,当模式有点复杂时,实现它比我想象的要复杂。在线示例通常坚持使用字符串和布尔值。


来自spec https://facebook.github.io/graphql:

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

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

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

当您使用 SDL 编写模式时,必须创建一个模式似乎是多余的Load类型和一个LoadInput输入,特别是当它们具有相同的字段时。然而,在底层,您定义的类型和输入会变成非常不同的对象类,每个类都具有不同的属性和方法。有特定于某个的功能GraphQLObjectType(比如接受参数)不存在于GraphQLInputObjectType——反之亦然。

试图用另一个代替另一个有点像试图将方钉放入圆孔中。 “我不知道为什么我需要一个圆。我有一个正方形。它们都有直径。为什么我需要两者?”

除此之外,还有一个很好的实际理由将类型和输入分开。这是因为在很多情况下,您将公开您不会在输入中公开的类型的大量字段。

例如,您的类型可能包含实际上是基础数据组合的派生字段。或者它可能包含与其他数据关系的字段(例如friends场上的User)。在这两种情况下,将这些字段作为作为某些字段的参数提交的数据的一部分是没有意义的。同样,您可能有一些输入字段,您不想在其对应的类型(apassword我想到了领域)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apollo / GraphQl - 类型必须是输入类型 的相关文章

随机推荐

  • Wicket 是适合单页应用程序的 Web java 框架吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • linq toEntity vs Fluent nhibernate vs linq to sql(帮助)

    我必须为新闻频道建立一个网站 请帮我决定使用哪种技术进行数据操作 1 实体连接 2 Linq 到 SQL 3 流畅的NHibernate 4 ADO Net 网站将基于 ASP Net MVC 和 C 主要问题 1 应该易于维护和扩展 2
  • Visual Studio Code Intellisense 不适用于 Javascript

    我在 Windows 和 Mac 上使用 Visual Studio Code VSC 0 10 11 为了解决这个问题 我有这个小 JavaScript 片段 use strict const os require os console
  • 每天在 8:00、12:30、17:00 运行 Gmail Google Apps 脚本

    我需要每天运行 Google Apps 脚本 3 次 8 00 12 30 17 00 这个怎么做 我已经看过了Triggers 更具体地说Time driven 小时计时器 但是Every hour Every 2 hours Every
  • 如何获取扩展列表视图项中复选框的ID?

    我有一个扩展列表视图 其中父节点和子项目中都有复选框 所有数据均来自网络服务 因此是动态的 附图 现在在菜单项上单击 我想获取所有复选框状态 请指导我如何获取其中使用的复选框的 ID 附代码 public class Object Secu
  • 获取当前页面的url

    在使用 GAS HtmlService 的 Web 应用程序上 我需要获取当前页面的 url 以在模板中构建新链接 该网络应用程序将在 Google 站点页面 GAS 作为小工具 中运行 但也可以独立运行 我正在尝试 var pageUrl
  • 使用 Open XML sdk 检索内容控件时出现问题

    我正在开发一个可以生成Word文档的解决方案 Word文档是根据已定义内容控件的模板文档生成的 当我的模板中只有一个内容控件时 一切都很顺利 但在使用更多内容控件扩展模板文档后 我遇到了异常 我似乎没有找到内容控件 这是我的方法 priva
  • UIWebView PaginationMode总是显示白色背景,如何使其透明?

    我尝试使用 paginationMode 为 iOS 7 进行 html 内容分页 set webview to transparent webView backgroundColor UIColor clearColor webView
  • 使用 Python 模块 SMBus、Raspberry Pi 和 Arduino 时出现输入/输出错误

    我已经连接了一个树莓派 http en wikipedia org wiki Raspberry Pi and 彩虹杜伊诺 http en wikipedia org wiki List of Arduino boards and comp
  • 如何从命令行获取最新的 Visual Studio 解决方案?

    如何以递归方式获取解决方案的最新版本 就像在 Visual Studio 的解决方案资源管理器上下文菜单中完成的那样 我想从命令行或通过宏来执行此操作 我正在尝试使用一组批处理文件来自动化部分日常工作 我相信很多开发人员都希望拥有这样的东西
  • JSF h:outputStylesheet 转换器 - 动态 css?

    我刚刚注意到
  • 是否可以在没有 qmake 的情况下使用 Qt Creator?

    我听说可以使用 Qt Creator 构建非 Qt 应用程序 例如简单的 C HelloWorld 我下载并安装了 Qt Creator 并尝试用它编译简单的代码 但我没有成功 Creator 需要 qmake 来创建 makefile 虽
  • Docker 仅向主机公开端口

    docker 是否能够仅向主机公开端口而不向外部公开端口 我需要让 docker 与 mongo 数据库一起运行 并且我希望它只能从主机访问 但我需要链接主机端口 27017 这可能吗 或者唯一可能的方法是更改 防火墙定义 当然可以 只需将
  • 在标签android中添加片段的最佳方法是什么

    我的应用程序有一个底部导航栏 其中有 5 个选项卡 所以根据这些选项卡 我有 5 个片段 当我单击选项卡时 片段会根据该选项卡发生变化 我可以使用方法 beginTransaction replace 来切换片段 我不希望每次切换选项卡时都
  • django 管理页面和 JWT

    我们使用 django rest framework 和 django rest framework jwt 进行身份验证 它可以在除 django 管理页面之外的任何地方使用ip port admin 那仍然需要用户名和密码 是否有设置或
  • Maven 测试无法使用 Spring Boot 2.2 和 JUnit 5 运行 Cucumber 场景

    我正在 Spring Boot 2 2 6 上尝试 JUnit 5 和 Cucumber 并且在我的应用程序中需要 BDD 场景和单元测试 我已经创建了一个虚拟 ping 控制器对应的功能文件 一切正常 我运行时不会调用黄瓜测试mvn cl
  • Ruby 奇怪的错误

    每当我需要 ruby 或 irb 中的文件时 我都会收到此错误 LoadError no such file to load insert any filename rb from
  • 隐藏特定表的第 n 个子级

    我在一页上有两个表格 我该如何解决第二个问题 id tapp 运行显示 隐藏第 n 个子函数 我无知地尝试通过将 id 引用添加到开头来解决特定的表 td nth child var x document getElementById ta
  • 通过 PHP 从内容配置中提取文件名

    我需要一个正则表达式从以下字符串中提取文件名 包括文件扩展名 attachment filename UTF 8 test rar 或者像这样 attachment filename UTF 8 Epost 20 test part01 r
  • Apollo / GraphQl - 类型必须是输入类型

    向大家致以我正在学习的过程 并将 Apollo 和 graphQL 集成到我的一个项目中 到目前为止一切顺利 但现在我正在尝试进行一些突变 并且在输入类型和查询类型方面遇到了困难 我觉得事情比应有的复杂得多 因此我正在寻求有关如何处理我的情