Apollo Federation是否支持code-first模式?现有代码优先Schema如何适配子图构建
解决方案
该方案完全可落地,无需重写现有code-first的业务逻辑,只需增加一层转换适配即可,具体操作如下:
步骤1:转换现有schema为子图兼容格式
buildSubgraphSchema本质只需要typeDefs(SDL字符串)和resolvers(解析器映射)两个输入,你可以通过官方工具直接从现有GraphQLSchema实例提取这两个参数:
依赖安装
npm install @graphql-tools/schema
转换代码
import { printSchema } from 'graphql'; import { buildSubgraphSchema } from '@apollo/subgraph'; import { extractResolversFromSchema } from '@graphql-tools/schema'; import { userSchema } from './schema'; // 从现有schema提取typeDefs和resolvers const typeDefs = printSchema(userSchema); const resolvers = extractResolversFromSchema(userSchema); // 构建符合联邦规范的子图schema const federatedSchema = buildSubgraphSchema([{ typeDefs, resolvers }]);
步骤2:修改服务启动配置
替换你原有server.ts中的schema配置即可:
const server = new ApolloServer({ schema: federatedSchema }); server.listen(4001).then(({ url }) => { console.log(`User subgraph running at ${url}`); });
步骤3:适配联邦特有指令(可选,按需配置)
如果需要给实体加联邦特有指令(比如@key、@extends等),直接在code-first定义的类型extensions中配置即可,不用修改SDL:
const userType = new GraphQLObjectType({ name: 'User', description: 'User Type Definition', // 新增联邦配置,对应SDL中的 @key(fields: "username") extensions: { apollo: { key: { fields: 'username' } } }, fields: (): any => ({ // 原有字段配置完全不变 username: { type: new GraphQLNonNull(GraphQLString), }, // 其余字段省略 }), });
注意事项
- 原有所有业务逻辑、解析器代码无需修改,可100%复用
- 如果有自定义标量、自定义指令,转换后需验证配置是否正常生效
- 改造完成后可通过Apollo官方工具校验子图schema的合法性,确认可被网关正常拉取
内容的提问来源于stack exchange,提问作者Batuhan
相关产品推荐
相关产品推荐

