这是一种方法
您可以对主端点使用扩展架构,并为 graphiql 端点使用没有扩展的相同架构。
让我们以这个模式定义为例:
// schemaDef
type Query {
anonQuery: QueryResult
adminQuery: AdminQueryResult @admin
}
和可执行模式:
const schema = makeExecutableSchema({
typeDefs: [schemaDef /* ... additional schema files */],
resolvers: merge(schemaResolvers/* ... additional resolvers */)
})
extend
现在,让我们在关键字
的帮助下拆分模式定义。在此处阅读有关扩展类型和extend
关键字的信息。
// anonymous part of the original schema definition:
type Query {
anonQuery: QueryResult
}
// admin extensions definitions:
extend type Query {
adminQuery: AdminQueryResult @admin
}
为避免出现有关未在架构中定义的解析器的警告,您可能希望将与管理员相关的解析器拆分到另一个文件或另一个解析器映射。
现在您将拥有 2 个可执行模式:
const mainSchema = makeExecutableSchema({
typeDefs: [schemaDef /* ... additional schema files */],
resolvers: merge(schemaResolvers/* ... additional resolvers */)
})
const extendedSchema = makeExecutableSchema({
typeDefs: [schemaDef, adminSchemaExtensions /* ... additional schema files */],
resolvers: merge(schemaResolvers, adminSchemaResolvers /* ... additional resolvers */)
})
您的主要端点应使用扩展架构。
router.use('/graphql', /* some middlewares */, graphqlExpress({schema: extendedSchema}))
由于 GraphiQL 端点需要一个 GraphQL 端点,因此您必须专门为第二个模式创建另一个端点。也许是这样的:
router.use('/graphql-anon', /* some middlewares */, graphqlExpress({schema: mainSchema}))
router.use('/graphiql', /* some middlewares */, graphiqlExpress({endpointURL: '/graphql-anon'}))
而已!
现在您的大部分代码都是共享的,并且只有部分模式可以使用 GraphiQL 接口访问。
将管理员定义放在单独的文件中可能更方便或更不方便,具体取决于您的项目、代码和偏好。