Apollo Federation 是不是支持代码优先方法?

Posted

技术标签:

【中文标题】Apollo Federation 是不是支持代码优先方法?【英文标题】:Has Apollo Federation support code-first approach?Apollo Federation 是否支持代码优先方法? 【发布时间】:2021-12-28 12:45:38 【问题描述】:

我有code-first 项目声明。但我想将它们用作微服务。在这种情况下,我如何根据 Apollo 的 schema-first 方法将我的 typeDefsresolvers 分开。可能吗 ?。我在graphql-jsapollo 文档中没有找到任何包含这种方法的资源。任何建议都会很棒..

Apollo 文档中它被描述为(可以访问here):

const server = new ApolloServer(
  schema: buildSubgraphSchema([ typeDefs, resolvers ])
);

buildSubgraphSchema() 不支持架构作为参数。

想要的方法:

const server = new ApolloServer(
  // Instead of schema-first style
  // schema : buildSubgraphSchema([ typeDefs, resolvers ])
  // this:
  schema: buildSubgraphSchema([userSchema])
);

看一下代码:

userType.ts

const userType = new GraphQLObjectType(
  name: 'User',
  description: 'User Type Definition',
  fields: (): any => (
    username: 
      type: new GraphQLNonNull(GraphQLString),
    ,
    email: 
      type: GraphQLString,
    ,
    phone: 
      type: GraphQLString,
    ,
    firstName: 
      type: GraphQLString,
    ,
    lastName: 
      type: GraphQLString,
    ,
  ),
);

userQueries.ts

const userQueries = 
  users: 
    type: new GraphQLList(userType),
    description: 'Return users',
    resolve: () => 
      return getUsers();
    ,
  ,
;

query.ts

const query = new GraphQLObjectType(
  name: 'Query',
  description: 'Queries',
  fields: userQueries,
);

schema.ts

const userSchema = new GraphQLSchema(
  query,
  types: [userType],
);

server.ts

const server = new ApolloServer( userSchema );
server.listen(4000).then(( url ) => 
  console.log('Running a GraphQL API server at localhost:4000/graphql');
);

【问题讨论】:

【参考方案1】:

我在graphqlapollo-server 包中找到了所描述问题的解决方案。

我们可以通过gqlprintSchema这样的函数获取typeDefs

注意:未定义的对象和变量可以在问题中找到。

import  gql  from 'apollo-server';
import  /* GraphQLSchema */ printSchema  from 'graphql';

const typeDefs = gql(
    printSchema(
      userSchema,
      // Or 
      //  new GraphQLSchema(
      //    query: queryType,
      //    mutation: mutationType,
      //  )
    )
);

const resolvers = 
  Query: userQueries,
  // Mutation: someMutationObject, if there is mutation.
;

const server = new ApolloServer(
  schema: buildSubgraphSchema([ typeDefs, resolvers ]),
);

重要: 使用 buildSubgraphSchema() 创建的架构不支持子字段解析器。我不知道真正的名字是什么。但它看起来像:

fullName: 
      type: GraphQLString,
      description: 'TESTSETSET',
      resolve: (
        parent:  firstName: any; lastName: any ,
        args: any,
        context: any,
        info: any,
      ) => 
        console.log('Here is not working if buildSubgraphSchema() used.');

        return parent.firstName + parent.lastName;
      ,
    ,

【讨论】:

以上是关于Apollo Federation 是不是支持代码优先方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 2 buildService(上传和标头)添加到 apollo federation?

Apollo Federation 从 ID 解析数组

如何将 REST API 迁移到 GraphQL Apollo Federation

使用 apollo-federation 独立构建 GraphQL 服务

@apollo/federation 包的替代品

除了 Apollo,还有其他 GraphQL Federation 实现吗?