xun*_*nux 5 node.js graphql apollo-server graphql-tools graphql-schema
我的困境始于将我的 graphql 模式从单个 .graphql 文件扩展到多个文件的简单愿望,这样我就可以更好地组织模式,这样它就不会变成一个失控的大文件。
我的原始布局非常简单,我在schema.graphql文件中有一个工作模式。我将能够使用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 });
Run Code Online (Sandbox Code Playgroud)
然后他们说要修改它,只需进行这些更改
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,
});
Run Code Online (Sandbox Code Playgroud)
我做了这些更改,但重要的区别是它们不再用于makeExecutableSchema()他们的示例中,这对我来说非常重要,因为我需要包含指令。我现在如何处理架构?我如何声明指令?他们的指令文件仍然使用makeExecutableSchema,但我不能再使用它,因为新的loadSchemaSync函数返回的对象,而不是一个字符串,我需要传递给typeDefs在makeExecutableSchema
我正在使用 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,
});
Run Code Online (Sandbox Code Playgroud)
这允许我的服务器运行,并且我可以执行查询和更改,但是,我的指令不再有效,并且我不再对受保护的查询进行身份验证。
我想要一种方法来导入我的 .graphql 文件并将其解析为一个字符串,这样我就可以typeDefs像以前一样在 importSchema() 中使用它,或者一种不使用 makeExecutableSchema() 来声明我的目录的方法,以便它们继续工作!
我已经查看了文档并查看了其他库,到目前为止我一直很简短,非常感谢任何提示或指导
makeExecutableSchema仍然是其中的一部分graphql-tools,您可以继续使用它,如文档中所示。文档中显示的示例的问题在于它与您之前所做的不等同。你应该使用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 });
Run Code Online (Sandbox Code Playgroud)
或者,如果您遵循该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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |