graphql-modules不调用__resolveType

时间:2019-07-03 23:31:44

标签: node.js graphql apollo-server

我不确定__resolveType函数在接口/联合上的用途/作用,但是我想它正在添加具有已解析类型的__typename字段。但是,我似乎无法在graphql-modules下使用它。这里是子集,但是我的架构的足够子集。

const typeDefs = gql`
interface Node {
    id: ID!
}

type User implements Node {
    id: ID!
    email: String!
    password: String
}

type Group implements Node {
    id: ID!
    name: String!
}

type Query {
    node(id: ID!): Node
}`;   

下面是我的解析器。

const resolvers = {
    Query: {
        node: () => {
            return { id: 'abc', email: 'a@b.c', password: 'test' };
        }
    },
    Node: {
        __resolveType: () => {
            console.log('__resolveType');
            return 'User';
        }
    }
}

一起组合成一个模块。

const Module = new GraphQLModule({
    resolvers,
    typeDefs,
});

与Apollo服务器一样使用。

const server = new ApolloServer({
    modules: [Module],
})

// Launch etc...

但是当查询node时,__ resolveType没有得到记录,并且出现以下错误。

  

抽象类型节点必须在运行时解析为字段{。id:“ abc”,电子邮件:“ a@b.c”密码:“ test”}的Query.node的对象类型,收到“未定义”。 Node类型应提供“ resolveType”函数,或者每种可能的类型应提供“ isTypeOf”函数。”

我在做什么错了,我该如何解决这个问题?

快速说明:在__typename: 'User'的返回对象中添加Query.node似乎可行,但似乎不是理想的解决方案

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,可以确认使用graphql-modules时从未调用过__resolveType。我将在回购中提出一个问题,并引用此SO。将回传我得到的任何答案。

已在回购问题中报告了此问题,解决方法是将顶级模块架构传递给apollo服务器,而不是作为模块

({
    schema: Appmodule.schema,
    context: session => session
})

在此处查看问题。 https://github.com/Urigo/graphql-modules/issues/619

可以确认这是正常的