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
方法将我的 typeDefs
和 resolvers
分开。可能吗 ?。我在graphql-js
和apollo
文档中没有找到任何包含这种方法的资源。任何建议都会很棒..
在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】:我在graphql
和apollo-server
包中找到了所描述问题的解决方案。
我们可以通过gql
和printSchema
这样的函数获取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?
如何将 REST API 迁移到 GraphQL Apollo Federation