GraphQLServer联合类型“抽象类型N必须在运行时解析为对象类型”错误

时间:2020-02-16 18:09:18

标签: typescript graphql

给出GraphQL and返回类型:

library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
lst1 <- combn(rev(names(df_ref)), 2, FUN = function(nm1)
       df_ref %>%
            select(nm1), simplify = FALSE)
imap(mget(ls(pattern = "^factor_\\d+_levels$")), 
        ~ list(.x, .y) ) %>% 
             map2(lst1, ., ~  crossing(.x, !! .y[[2]] := .y[[1]]) %>%
             rename_at(vars(ends_with('levels')), ~ str_remove(., '_levels')))
#[[1]]
# A tibble: 3 x 3
#  factor_3 factor_2 factor_1
#  <fct>    <fct>    <chr>   
#1 3        Y        A       
#2 3        Y        B       
#3 3        Y        C       

#[[2]]
# A tibble: 3 x 3
#  factor_3 factor_1 factor_2
#  <fct>    <fct>    <chr>   
#1 3        A        X       
#2 3        A        Y       
#3 3        A        Z       

#[[3]]
# A tibble: 3 x 3
#  factor_2 factor_1 factor_3
#  <fct>    <fct>    <chr>   
#1 Y        A        1       
#2 Y        A        2       
#3 Y        A        3       

要由给定的解析器返回:

union

我收到有关union GetBankAccountsResponseOrUserInputRequest = GetAccountsResponse | UserInputRequest type Query { getBankAccounts: GetBankAccountsResponseOrUserInputRequest! } 函数的这些警告或错误:

__resolveType

我已经在github问题和SO问题中搜索了几天以寻求解决此错误。

在我的解析器中实施__isTypeOfAbstract type N must resolve to an Object type at runtime for field Query.getBankAccounts with value { ..., __isTypeOf: [function __isTypeOf] }, received "undefined". Either the N type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.' 无效:

__resolveType

2 个答案:

答案 0 :(得分:1)

由于在我的解析器中实现__isTypeOfexport const Query = { getBankAccounts: (parent, args, context: IContext, info) => { return { __isTypeOf(obj) { // OR __resolveType, none of them work return `GetAccountsResponse`; }, accounts: [] }; }, }; 对我不起作用,因此我最终通过将__resolveType直接添加到解析器返回对象中解决了这个问题。

__isTypeOf解析器实现中:

__typename

希望这对某人有帮助。

答案 1 :(得分:1)

您的解析器映射设置不正确。

传递给ApolloServer(或makeExecutableSchema)的解析器映射应该是一个对象,其键为架构中的类型名称,每个键都映射到另一个对象,其键为该类型的字段名称。然后,每个字段名称都映射到解析器功能。

const resolvers = {
  SomeType: {
    someField: (parent, args, context, info) => { ... },
  },
}

您使用相同的解析器映射为联合或接口传递resolveType函数。模式是相同的,但是类型的名称是联合或接口的名称,而不是字段名称,键是__resolveType

const resolvers = {
  SomeType: {
    someField: (parent, args, context, info) => { ... },
  },
  SomeUnion: {
    __resolveType: (parent) => { ... },
  }
}

resolveType函数应始终返回与模式中现有对象类型名称匹配的字符串。

如果您使用__isTypeOf而不是__resolveType,则外观会有所不同,因为isTypeOf函数与特定的对象类型而不是接口或联合相关联。 This is all shown in the docs。因此,解析器映射如下所示:

const resolvers = {
  SomeType: {
    someField: (parent, args, context, info) => { ... },
    __isTypeOf: (parent) => { ... },
  },
}

__isTypeOf应该始终返回truefalse,这取决于传入的对象实际上是否是该类型。

您只需要使用__resolveType__isTypeOf。如果使用__isTypeOf,则必须将其添加到联合或接口中的每种可能的对象类型中。