如何将Apollo服务器默认解析器与函数一起使用?

时间:2019-02-08 04:56:18

标签: graphql apollo-server

在Graphql-tools文档的默认解析器部分中,指出

  
      
  1. 从obj返回具有相关字段名称的属性,或者
  2.   
  3. 使用相关字段名称在obj上调用一个函数,并将查询参数传递给该函数
  4.   

https://www.apollographql.com/docs/graphql-tools/resolvers.html#Default-resolver

类型定义:

type AggregateMessage {
  count: Int!
}

给出此查询解析器:

Query: {
    async messagesConnection(root: any, args: any, context: any, info: any) {
      const messages: IMessageDocument[] = await messageController.messages();

      const edges: MessageEdge[] = [];
      for (const node of messages) {
        edges.push({
          node: node,
          cursor: node.id
        });
      }
      // return messages;
      return {
        pageInfo: {
            hasNextPage: false,
            hasPreviousPage: false
        },
        edges: edges,
        aggregate: {
          count: () => {
            // Resolve count only
            return 123;
          }
        }
      };
   }
}

因此,如果我像这样手动定义解析器,那么它将起作用。

AggregateMessage: {
    count(parent: any, args: any, context: any, info: any) {
      return parent.count();
      // Default resolver normally returns parent.count
      // I want it to return parent.count() by default
    }
}

但是,如果我删除了定义并依靠默认的解析功能,那么它将无法正常工作。

如果我删除手动解析器并依靠默认解析器行为来调用属性名称上的函数,我希望它按照文档中的点2调用函数parent.count()。

  
      
  1. 使用相关字段名称在obj上调用一个函数,并传递   查询该函数的参数
  2.   

但是它给出类型错误,因为“ count”被定义为Int类型,但实际上是一个函数。如何正确执行此操作,以便调用count函数并在解析时返回值,而不必自己定义解析器?

Int cannot represent non-integer value: [function count]

1 个答案:

答案 0 :(得分:0)

该问题原来是由graphql-tools中的mergeSchemas引起的。

将解析器传递到mergeSchemas(而不是apollo服务器或makeExecutableSchema)时,默认的功能解析器功能无法正常工作。

https://github.com/apollographql/graphql-tools/issues/1061

我不确定这是否是预期的功能,但是将解析器移至makeExecutableSchema调用可以解决此问题。