如何将GraphQLInputObject整合到动态加载的JavaScript GraphQL Schema中?
整合JS定义的GraphQL输入类型到现有Schema
有两种常用方案可以把你用JavaScript创建的UserQueryInput输入类型整合到现有Schema中,根据你的场景选择:
方案一:将输入类型定义移至SDL文件(推荐)
这是GraphQL的最佳实践,类型定义集中在.graphql文件中更易维护,且无需修改现有_loadSchema函数的核心逻辑:
- 在你的
../graphql/typedefs/目录下的任意.graphql文件(比如新建inputs.graphql)中添加输入类型的SDL定义:
input UserQueryInput { where: String select: String }
- 在定义
user查询的.graphql文件中,更新查询定义以引用这个输入类型:
type Query { user(input: UserQueryInput): User # 这里User是你已定义的用户类型 }
- 保持原
_loadSchema函数不变,loadSchema会自动加载所有.graphql文件中的类型定义,无需额外处理。
方案二:直接在JS中合并输入类型到Schema
如果必须保留JavaScript定义的输入类型,可以通过以下步骤整合:
- 导入GraphQL的
printType工具,将JS定义的输入类型转换为SDL字符串:
const { printType } = require('graphql'); // 确保UserQueryInput已被正确导入到当前文件
- 修改
_loadSchema函数,合并文件加载的类型定义与JS生成的SDL:
async function _loadSchema() { // 加载从文件读取的类型定义 const typeDefsFromFiles = await loadSchema(path.join(__dirname, '../graphql/typedefs/*.graphql'), { loaders: [new GraphQLFileLoader()] }); // 将JS输入类型转换为SDL字符串 const userQueryInputSDL = printType(UserQueryInput); // 合并所有类型定义 const mergedTypeDefs = [typeDefsFromFiles, userQueryInputSDL]; const resolvers = await loadFiles(path.join(__dirname, '../graphql/resolvers')); // 使用合并后的类型定义创建可执行Schema const schema = makeExecutableSchema({ typeDefs: mergedTypeDefs, resolvers }); return applyMiddleware(schema, shield); }
- 确保你的
user查询定义(无论是在SDL文件还是JS中)已经引用了UserQueryInput作为输入参数。
内容的提问来源于stack exchange,提问作者D_Gamer
相关产品推荐
相关产品推荐

