草庐IT

541.【GraphQL】_typename千万不要写成一样的

七镜 2023-09-23 原文

这个问题我已经经历过两三次了:*graphql 服务端定义接口时,千万不要把每个接口中的_typename写成一样的
在go语言中,graphql 的实现里头, 错误的示例如下:

var responseDimensionReadingType = graphql.NewObject(graphql.ObjectConfig{
    Name: "ResponseCommon",
    Fields: graphql.Fields{
        "code":    &graphql.Field{Type: graphql.Int},
        "content": &graphql.Field{Type: graphql.NewList(dimensionReadingType)},
        "count":   &graphql.Field{Type: graphql.Int},
        "msg":     &graphql.Field{Type: messageType},
    },
    Description: "",
})
var responseDimensionWritingType = graphql.NewObject(graphql.ObjectConfig{
    Name: "ResponseCommon",
    Fields: graphql.Fields{
        "code":    &graphql.Field{Type: graphql.Int},
        "content": &graphql.Field{Type: graphql.NewList(dimensionWritingType)},
        "count":   &graphql.Field{Type: graphql.Int},
        "msg":     &graphql.Field{Type: messageType},
    },
    Description: "",
})
  • 可以看到,这两个graphql类型定义中,都将 Name 写成了 ResponseCommon
  • 这个 Name 对应的就是前面说的 _typename
    _typename

当两个接口(里面的_typename同名)同时存在时就会出错。


触发报错

报错如下:


{"data":null,"errors":[{"message":"Variable \"$from_id\" cannot be non-input type \"String!\".","locations":[{"line":1,"column":34}]},{"message":"Unknown type \"String\".","locations":[{"line":1,"column":34}]},{"message":"Variable \"$from_nickname\" cannot be non-input type \"String!\".","locations":[{"line":1,"column":59}]},{"message":"Unknown type \"String\".","locations":[{"line":1,"column":59}]},{"message":"Variable \"$content\" cannot be non-input type \"String!\".","locations":[{"line":1,"column":78}]},{"message":"Unknown type \"String\".","locations":[{"line":1,"column":78}]},{"message":"Variable \"$from_id\" of type \"\" used in position expecting type \"String!\".","locations":[{"line":1,"column":24},{"line":3,"column":14}]},{"message":"Variable \"$content\" of type \"\" used in position expecting type \"String!\".","locations":[{"line":1,"column":68},{"line":4,"column":14}]},{"message":"Variable \"$from_nickname\" of type \"\" used in position expecting type \"String!\".","locations":[{"line":1,"column":43},{"line":5,"column":20}]}]}
  • 报错信息,我是没明白啥意思,顺着报错信息找问题,一点头绪都没。

调查这个问题时,感觉离谱之处在于:我随便保留两个接口中的其中一个,都不会有问题,两个接口同时出现才会报错。

记忆中,第一次出现这个问题,我debug,debug了一天没找着原因,后来还是整整回滚了一个版本的代码才解决;第二次遇到这个问题,也是花了好久才知道是_typename的事儿。这次必须记下来,警醒自己!

有关541.【GraphQL】_typename千万不要写成一样的的更多相关文章

  1. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  2. java - Java 中的 "caller"和 Ruby 中的 "receiver"一样吗? - 2

    如果我说x.hello()在Java中,对象x正在“调用”它包含的方法。在Ruby中,对象x正在“接收”它包含的方法。这只是表达相同想法的不同术语,还是意识形态上的根本差异?来自Java,我发现Ruby的“接收器”想法非常令人困惑。也许有人可以解释这与Java的关系? 最佳答案 在您的示例中,x不调用hello()。包含该片段的任何对象都是“调用”(即,它是“调用者”)。在Java中,x可以称为接收者;它正在接收对hello()方法的调用。 关于java-Java中的"caller"和R

  3. ruby-on-rails - 如何使用 graphql-ruby 指定多态类型? - 2

    我有一个UserType和一个可以是Writer或Account的userable。对于GraphQL,我想也许我可以像这样使用UserableUnion:UserableUnion=GraphQL::UnionType.definedoname"Userable"description"AccountorWriterobject"possible_types[WriterType,AccountType]end然后像这样定义我的用户类型:UserType=GraphQL::ObjectType.definedoname"User"description"Auserobject"fie

  4. ruby - 发送信号时运行代码,但不要在 Ruby 中捕获信号 - 2

    我有在服务器上运行的代码,在服务器硬关闭之前,发送了一个信号SIGTERM让我的代码知道它需要清理。我想在发生这种情况时运行代码并将信号发送回同一个程序,以便任何其他需要清理的代码都可以这样做。我不想捕获信号或改变信号行为,我只需要在我的程序的其余部分解释SIGTERM之前运行一些东西。目前我可以做类似的事情Signal.trap('TERM')doputs"Gracefulshutdown"exitend但如果同一个应用中的多段代码试图做同样的事情,它就不起作用了。例如:Signal.trap('TERM')doputs"Gracefulshutdown"exitendSignal.

  5. Ruby AWS::S3::S3Object (aws-sdk):是否有与 aws-s3 一样的流式数据方法? - 2

    在aws-s3中,有一种方法(AWS::S3::S3Object.stream)可让您将S3上的文件流式传输到本地文件。我无法在aws-sdk中找到类似的方法。即在aws-s3中,我这样做:File.open(to_file,"wb")do|file|AWS::S3::S3Object.stream(key,region)do|chunk|file.writechunkendendAWS::S3:S3Object.read方法确实将block作为参数,但似乎没有对其执行任何操作。 最佳答案 aws-sdkgem现在支持S3中对象的分

  6. c# - Ruby 是否像 C# 一样具有 Skip(n)? - 2

    在C#中你可以这样做:varlist=newList(){1,2,3,4,5};list.skip(2).take(2);//returns(3,4)我正在尝试学习所有Ruby可枚举方法,但我没有看到skip(n)的等效方法a=[1,2,3,4,5]a.skip(2).take(2)#takeexists,skipdoesn't那么,“最好的”Ruby方法是什么?所有这些都有效,但它们非常丑陋。a.last(a.length-2).take(2)(a-a.first(2)).take(2)a[2...a.length].take(2) 最佳答案

  7. ruby-on-rails - Rails 中每个循环的最后一次迭代不要有逗号 - 2

    我想在Rails中打印出以逗号分隔的链接列表。这是我得到的:">,这是我想要的:ThingA,ThingB,ThingC但是现在我在循环的最后一次迭代中得到了一个额外的逗号!我该怎么办? 最佳答案 一种方法是使用map然后Array#join: 关于ruby-on-rails-Rails中每个循环的最后一次迭代不要有逗号,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/266957

  8. ruby-on-rails - 我如何解析一个 Excel 文件,它会给我提供与视觉上完全一样的数据? - 2

    我正在使用Rails5(Ruby2.4)。我想阅读.xls文档,我想将数据转换为CSV格式,就像它出现在Excel文件中一样。有人推荐我使用Roo,所以我有book=Roo::Spreadsheet.open(file_location)sheet=book.sheet(0)text=sheet.to_csvarr_of_arrs=CSV.parse(text)但是,返回的内容与我在电子表格中看到的内容不同。例如,电子表格中的一个单元格有16:45.81当我从上面获取CSV数据时,返回的是"0.011641319444444444"如何解析Excel文档并准确获取我所看到的内容?我不在

  9. ruby - 像 Smalltalk 一样浏览 Ruby 代码? - 2

    与Smalltalk类层次结构浏览器最接近的等效项是什么?我见过一些解决方法,例如this,但它似乎不可编写脚本。 最佳答案 确实没有,至少没有包含静态和动态行为的类似Smalltalk的UI。Eclipse和IntelliJ都具有一定的结构洞察力。Eclipse有一种类似于浏览器的View。两者最大的问题是,除非您正在处理实时对象(例如,调试),否则您不一定知道对象的所有行为,因为有些行为是在运行时定义的。没有图像或部分运行时的静态View无法提供完整的图片。IntelliJ在解决问题方面做得不错。例如,具有attr_access

  10. ruby - 调用 super 时不要传递 block - 2

    如何为super调用设置一个block为nil?classAdeffooifblock_given?result=yield#dostuffwiththeyieldresultend#somemorecodeendendclassBblockcalled#=>blockcalled我不想让block两次。block_given?在类A中是否有可能返回false?背景是我不拥有A类,我无法更改它的foo方法,但我想避免调用我的block两次。我也不想将虚拟/空block传递给super,因为A的foo方法的行为在给定block时发生变化。 最佳答案

随机推荐