如何在GraphQL Mesh自定义解析器中复用OpenAPI类型?
解决GraphQL Mesh自定义解析器复用OpenAPI类型的问题
核心方案:利用全局扩展复用OpenAPI生成的类型
GraphQL Mesh默认会隔离不同数据源(handler)的类型,直接跨handler引用类型必然失败。正确的做法是通过全局的additionalTypeDefs和additionalResolvers来复用OpenAPI生成的类型,具体步骤如下:
1. 配置OpenAPI数据源
先在.meshrc.yaml中定义你的OpenAPI源,确保Mesh能生成对应类型:
sources: - name: MyOpenAPI # 该名称会作为类型前缀,后续引用时需要用到 handler: openapi: source: https://your-openapi-endpoint/swagger.json # 替换为你的OpenAPI地址
2. 全局扩展类型定义
通过additionalTypeDefs引用OpenAPI生成的类型(注意带源名称前缀),同时定义自定义查询/突变:
additionalTypeDefs: | extend type Query { customGetUser(id: ID!): MyOpenAPI_User # 格式:[源名称]_[OpenAPI类型名] } # 若需要给OpenAPI类型新增字段,可直接扩展 extend type MyOpenAPI_User { customComputedField: String }
3. 编写自定义解析器
在项目中创建自定义解析器文件(比如src/additional-resolvers.ts),通过MeshContext访问OpenAPI源的现有逻辑,或实现自定义处理:
import { MeshContext } from '@graphql-mesh/runtime'; export const resolvers = { Query: { customGetUser: async (_, { id }, context: MeshContext) => { // 直接复用OpenAPI源的查询逻辑 const originalUser = await context.MyOpenAPI.Query.getUser({ id }); // 添加自定义处理逻辑 return { ...originalUser, customComputedField: `Custom value for user ${id}` }; } } };
4. 配置全局解析器
在.meshrc.yaml中引入自定义解析器:
additionalResolvers: - './src/additional-resolvers.ts'
常见问题排查
- 自定义部分未显示在生成的Schema中:确保自定义的类型扩展和解析器都配置在全局的
additionalTypeDefs和additionalResolvers中,而非嵌套在某个handler的配置里——handler仅负责对应数据源的自动生成逻辑,全局扩展才会合并到最终Schema。 - 类型引用报错:检查OpenAPI生成的类型名称是否带了源名称前缀,比如源名为
MyOpenAPI,User类型会被命名为MyOpenAPI_User,可通过mesh build命令生成Schema文件后查看具体类型名称。
内容的提问来源于stack exchange,提问作者Danny Cui
相关产品推荐
相关产品推荐

