如何补全指定GraphQL查询的Schema变量及Resolver过滤逻辑?
GraphQL Schema 补全与 Resolver 参数获取方案
1. 补全 Schema 定义
1.1 基础类型与枚举定义
先补全查询依赖的枚举、输入类型:
# 航程状态枚举,根据业务补充实际值 enum VoyageVoyageStatusCodeEnum { IN_PROGRESS COMPLETED CANCELLED DELAYED }
1.2 过滤条件输入类型
定义支持and/or组合过滤的输入结构:
input VoyageWhereInput { # 多条件组合逻辑 and: [VoyageWhereInput!] or: [VoyageWhereInput!] # 单个过滤字段,按需扩展 voyageStatus: VoyageVoyageStatusCodeEnum orderType: String date: Date }
1.3 查询字段与变量定义
补全voyageList的参数规则和查询变量:
# 带变量的查询操作 query GetVoyages( $DateFilter: Date! $oType: String $voyStat: VoyageVoyageStatusCodeEnum ) { voyageList( limit: Int where: VoyageWhereInput ) { id voyageStatus orderType date # 其他需要返回的字段 } } # 根查询类型 type Query { voyageList( limit: Int where: VoyageWhereInput ): [Voyage!]! } # 航程实体类型 type Voyage { id: ID! voyageStatus: VoyageVoyageStatusCodeEnum! orderType: String date: Date! }
2. IMOS Resolver 中获取参数
Resolver 函数的第二个参数args会直接接收所有查询传入的参数(包括变量映射后的过滤条件、limit等),示例代码如下:
const voyageResolvers = { Query: { voyageList: async (parent, args, context, info) => { // 提取limit参数,可设置默认值 const pageLimit = args.limit || 10; // 提取where过滤条件 const filterConditions = args.where; // 解析过滤条件,转换为IMOS服务可识别的格式 let queryFilter = {}; if (filterConditions) { // 处理OR组合条件 if (filterConditions.or) { queryFilter.$or = filterConditions.or.map(cond => { return { ...(cond.voyageStatus && { voyageStatus: cond.voyageStatus }), ...(cond.orderType && { orderType: cond.orderType }), ...(cond.date && { date: cond.date }) }; }); } // 处理AND组合条件 if (filterConditions.and) { queryFilter.$and = filterConditions.and.map(cond => { return { ...(cond.voyageStatus && { voyageStatus: cond.voyageStatus }), ...(cond.orderType && { orderType: cond.orderType }), ...(cond.date && { date: cond.date }) }; }); } // 合并单个字段过滤规则 Object.assign(queryFilter, { ...(filterConditions.voyageStatus && { voyageStatus: filterConditions.voyageStatus }), ...(filterConditions.orderType && { orderType: filterConditions.orderType }), ...(filterConditions.date && { date: filterConditions.date }) }); } // 调用IMOS服务获取数据 const result = await context.imosVoyageService.fetchVoyages({ limit: pageLimit, filter: queryFilter }); return result; } } };
内容的提问来源于stack exchange,提问作者Himanshu Kumar
相关产品推荐
相关产品推荐

