【问题标题】:Empty object with union type in graphQLgraphQL中具有联合类型的空对象
【发布时间】:2019-05-27 23:49:15
【问题描述】:

当我在我的 graphQL 架构中使用联合类型时,我通常像这样使用它:

const documentTypeDefs = gql`
 union TestType = TypeExample1 | TypeExample2

 type Document {
   exampleKey: TestType
 }
`

然后我这样解决:

  TestType: {
    __resolveType(obj) {
     if(obj.property1) {
       return 'TypeExample1';
     }

     if(obj.property2) {
       return 'TypeExample2';
     }

    return null;
  },
}

但有时我在解析函数中得到空对象(即obj{})。我认为返回 nullundefined 可以完成这项工作,但不幸的是我遇到了错误:

"Abstract type ItemsType must resolve to an Object type at runtime for field Document.exampleKey with value {}, received \"{}\". Either the ItemsType type should provide a \"resolveType\" function or each possible type should provide an \"isTypeOf\" function."

那我该如何解析空对象呢? 谢谢!

【问题讨论】:

    标签: express graphql


    【解决方案1】:

    如果将一个空对象传递给__resolveType,这意味着您的字段正在解析为一个空对象。这意味着解析器中返回的值是一个空对象,或者返回的 Promise 解析为一个。

    如果您正在使用返回 List 的字段,则返回的项目之一也可能是空对象。如果您获取的文档之一实际上是空的或至少缺少您在 mongoose 架构中指定的字段,则在使用 MongoDB 时尤其可能出现这种情况。

    【讨论】:

    • 是的,我正在解析对象数组的常量的数据源,但其中很少是空的。因此,数据是以这种方式构建的。但问题是graphql 在resolveType 函数内部抱怨。我可以涵盖空对象但不能返回空类型的情况,因为据我所知,没有这样的类型可用。
    • @Murakami 我的意思是,这里的空对象通常表示其他地方出了问题,解决这个问题也可以解决这个问题。
    • 但是,如果解析为空对象是预期行为,您可以 1) 如果对象为空,则默认为其中一个; 2)当您返回空类型时,将第三种类型添加到联合中以覆盖情况;或 3) 选择更好的方法来区分 TypeExample1TypeExample2。例如,如果对象是特定模型的实例,您可以使用instanceof 来确定应在resolveType 中返回哪种类型。
    • 感谢您的回答。谈论选项 2 有一种方法可以构造空类型,即。没有键属性对?我试过了,但没有成功
    • 不,对象类型必须至少有一个符合规范的字段。
    猜你喜欢
    • 2023-03-03
    • 2019-06-05
    • 2020-04-19
    • 2018-09-28
    • 2019-07-01
    • 2019-05-17
    • 2018-12-23
    • 2017-12-30
    相关资源
    最近更新 更多