我的困境始于一个简单的愿望,希望将我的graphql schema从一个.graphql文件扩展到多个文件,这样我就可以更好地组织这个schema,这样它就不会增长到一个失控的大文件。
我最初的布局非常简单,并且在schema.graphql文件中有一个可用的模式。我可以使用graphql-import库中的importSchema('server/schema.graphql')将其解析为字符串,graphql-import库现在已被弃用https://github.com/ardatan/graphql-import
他们提到在最新版本中它已经合并到graphql-tools中,并在这里提供了一个迁移教程https://www.graphql-tools.com/docs/migration-from-import该教程看起来非常简单,因为他们的第一个示例几乎准确地说明了我的代码看起来是什么样子(除了我不使用es6导入,而是旧的fashoined ):
import { importSchema } from 'graphql-import';
import { makeExecutableSchema } from 'graphql-tools';
const typeDefs = importSchema(join(__dirname, 'schema.graphql'));
const resolvers = {
Query: {...}
};
const schema = makeExecutableSchema({ typeDefs, resolvers });然后他们说要修改它,简单地做这些改变
import { loadSchemaSync } from '@graphql-tools/load';
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';
import { addResolversToSchema } from '@graphql-tools/schema';
const schema = loadSchemaSync(join(__dirname, 'schema.graphql'), { loaders: [new GraphQLFileLoader()] });
const resolvers = { Query: {...} };
const schemaWithResolvers = addResolversToSchema({
schema,
resolvers,
});我做了这些更改,但最重要的区别是它们在示例中不再使用makeExecutableSchema(),这对我来说非常重要,因为我需要包括指令。我现在该如何处理模式呢?如何声明指令?他们的指令文档仍然使用makeExecutableSchema,但我不能再使用它了,因为新的loadSchemaSync函数返回一个对象,而不是字符串文字,我需要在makeExecutableSchema中将其传递给typeDefs
我使用的是apollo-server,所以一种可能的解决方法是在apollo-server构造函数中声明指令,并将这个新的schemaWithResolvers作为模式传递进来
const server = new ApolloServer({
schema, //this includes now the returned value of using addResolversToSchema()
schemaDirectives : {
auth:AuthDirective,
authRole: AuthRoleDirective
}
context : ({req}) => //dostuff,
});这允许我的服务器运行,我可以执行查询和突变,但是,我的指令不再起作用,并且我不再对受保护的查询进行身份验证。
我想要一种导入.graphql文件并将其解析为字符串的方法,这样我就可以在typeDefs中使用它,就像我过去使用importSchema()一样,或者想要一种不使用makeExecutableSchema()的方法来解密我的目录,这样它们就可以继续工作了!
我已经上上下下阅读了文档,也看过其他库,到目前为止,我一直不太了解,任何提示或指导都非常感谢。
发布于 2020-06-18 18:57:17
makeExecutableSchema仍然是graphql-tools的一部分,您可以按照文档中显示的here继续使用它。文档中显示的示例的问题是它不等同于您之前所做的事情。您应该改用loadTypedefsSync:
import { loadTypedefsSync } from '@graphql-tools/load';
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';
import { addResolversToSchema } from '@graphql-tools/schema';
const sources = loadTypedefsSync(join(__dirname, 'schema.graphql'), { loaders: [new GraphQLFileLoader()] });
const documentNodes = sources.map(source => source.document);
const resolvers = { Query: {...} };
const schema = makeExecutableSchema({ typeDefs, resolvers });或者,如果使用loadSchema路由,则应该能够在加载模式后将指令应用于该模式:
import { SchemaDirectiveVisitor } from "@graphql-tools/utils";
import { loadSchemaSync } from '@graphql-tools/load';
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';
import { addResolversToSchema } from '@graphql-tools/schema';
const schema = loadSchemaSync(join(__dirname, 'schema.graphql'), { loaders: [new GraphQLFileLoader()] });
const resolvers = { Query: {...} };
const schemaWithResolvers = addResolversToSchema({
schema,
resolvers,
});
SchemaDirectiveVisitor.visitSchemaDirectives(schemaWithResolvers, schemaDirectives);发布于 2020-07-06 07:23:36
我试过这种方法,但是我不能解决这个问题。一个独特的解决方案,它成功地采用了以下方法:
const { ApolloServer, makeExecutableSchema, gql} = require('apollo-server-express')
const { loadTypedefsSync } = require('@graphql-tools/load')
const { GraphQLFileLoader } = require('@graphql-tools/graphql-file-loader')
const path = require('path')
const sources = loadTypedefsSync(
path.resolve(__dirname, '../schema/root.graphql'),
{ loaders: [new GraphQLFileLoader()] }
)
const typeDefs = sources.map(source => source.document)const schema = makeExecutableSchema({
typeDefs: gql`${typeDefs[0]}`,
resolvers,
})发布于 2021-04-28 20:52:59
我也遇到了同样的问题,我通过.graphql加载了模式,我想添加graphql-constraint-directive。我的解决方案是用loadSchemaSync加载模式,然后使用wrapSchema来使用转换函数,您还需要将指令添加到其中一个.graphql文件中:
import { addResolversToSchema, wrapSchema } from 'graphql-tools';
import { GraphQLSchema } from 'graphql';
import resolvers from './resolver';
schema = loadSchemaSync('./**/*.graphql', {
loaders: [new GraphQLFileLoader()],
});
const schemaWithResolver = addResolversToSchema({
schema,
resolvers
});
const { constraintDirective } = require('graphql-constraint-directive')
const schemaConstrain = wrapSchema({
schema: schemaWithResolver,
transforms: [constraintDirective()]
})https://stackoverflow.com/questions/62441400
复制相似问题