如何解决缝合方案的解析器返回null
我已经将我的大架构文件拆分为单独的架构文件,例如bookSchema.js,userSchema.js等,如下所示:
/****** typedefs/userSchema.js ******/
const { gql } = require('apollo-server-express');
const UserSchema = gql`
extend type Query {
whoami: User
}
type User {
name: String!
}
`;
export default UserSchema;
/****** typedefs/index.js ******/
const { gql } = require('apollo-server-express');
import UserSchema from './userSchema';
import BookSchema from './bookSchema';
const DefaultSchema = gql`
type Query {
_: Boolean
}
type Mutation {
_: Boolean
}
`;
const Schema = [DefaultSchema,UserSchema,BookSchema];
export default Schema;
对于每个模式,我都定义一个相应的解析器模块,如下所示:
/****** resolvers/bookResolver.js ******/
const Resolvers = {
Query: {
books: (_,args,{models}) => models.Book.findAll(),},};
export default Resolvers;
/****** resolvers/index.js ******/
import UserResolvers from './userResolver';
import BookResolvers from './bookResolver';
const Resolvers = [UserResolvers,BookResolvers]
export default Resolvers;
最后,我的app.js如下所示:
import { ApolloServer,gql } from 'apollo-server-express';
import Schema from '../graphql/typedefs/';
import Resolvers from '../graphql/resolvers/';
import Models from '../models/';
import { mergeSchemas } from 'graphql-tools';
...
const schema = Schema;
const resolvers = Resolvers;
const models = Models;
const me = models.User.me();
const context = {
models,me,};
const mergedSchema = mergeSchemas({
schemas: schema
});
const server = new ApolloServer({ schema: mergedSchema,resolvers,context });
当我运行服务器并在Graphiql Web接口中执行graphql查询时,会得到空值。在将整体架构拆分成较小的架构并在我的ApolloServer
构造中使用合并的架构之后,为什么解析器不映射到架构?
将感谢您对此的想法。预先感谢!
解决方法
对于"graphql-tools": "^6.0.15"
,配置schemas
需要GraphQLSchema[]
类型。但是gql
函数的返回值是DocumentNode
类型。
因此,我将使用makeExecutableSchema(options)函数使用针对User
和Book
模块的相应typeDef和解析程序来获取架构。
但是实际上,mergeSchemas
的作用不是在单个graphql服务中组织代码。它用于将多个graphql微服务合并到graphql端点中。参见schema-stitching
我们可以创建对我们要使用的所有远程GraphQL API的引用,并将它们传递到mergeSchemas函数中以创建单个API。
对于组织单个graphql服务的代码,makeExecutableSchema
功能就足够了。
我仍然会解决您的问题。
例如
resolvers/bookResolver.ts
:
const Resolvers = {
Query: {
books: (_,args) => [{ name: 'jestjs' },{ name: 'js' }],},};
export default Resolvers;
resolvers/userResolver.ts
:
const Resolvers = {
Query: {
whoami: (_,args,{ models }) => ({ name: 'teresa teng' }),};
export default Resolvers;
resolvers/index.ts
:
import UserResolvers from './userResolver';
import BookResolvers from './bookResolver';
const Resolvers = [UserResolvers,BookResolvers];
export default Resolvers;
typedefs/bookSchema.ts
:
import { gql } from 'apollo-server-express';
const BookSchema = gql`
type Query {
books: [Book]!
}
type Book {
name: String!
}
`;
export default BookSchema;
typedefs/userSchema.ts
:
import { gql } from 'apollo-server-express';
const UserSchema = gql`
type Query {
whoami: User
}
type User {
name: String!
}
`;
export default UserSchema;
typedefs/index.ts
:
import userTypeDefs from './userSchema';
import bookTypeDefs from './bookSchema';
import { gql,makeExecutableSchema } from 'apollo-server-express';
import resolvers from '../resolvers';
const defaultTypeDefs = gql`
type Query {
_: Boolean
}
type Mutation {
_: Boolean
}
`;
const [UserResolvers,BookResolvers] = resolvers;
const userSchema = makeExecutableSchema({ typeDefs: userTypeDefs,resolvers: UserResolvers });
const bookSchema = makeExecutableSchema({ typeDefs: bookTypeDefs,resolvers: BookResolvers });
const defaultSchema = makeExecutableSchema({ typeDefs: defaultTypeDefs });
export default [userSchema,bookSchema,defaultSchema];
app.ts
:
import { ApolloServer } from 'apollo-server';
import schema from './typedefs';
import resolvers from './resolvers';
import { mergeSchemas } from 'graphql-tools';
const mergedSchema = mergeSchemas({
schemas: schema,});
const server = new ApolloServer({ schema: mergedSchema,resolvers });
const port = 3000;
server.listen(port).then(({ url }) => console.log(`? Server ready at ${url}`));
启动服务器,您将获得整个架构,如下所示:
type Book {
name: String!
}
type Mutation {
_: Boolean
}
type Query {
whoami: User
books: [Book]!
_: Boolean
}
type User {
name: String!
}
源代码:https://github.com/mrdulin/apollo-graphql-tutorial/tree/master/src/stackoverflow/63889126
,好的,我设法对mergeSchemas(options)
方法和ApolloServer(config)
构造函数进行了一些修改,使事情井然有序,如下所示:
// Modification 1: Pass resolvers here
const mergedSchema = mergeSchemas({
schemas: schema,resolvers : resolvers,});
// Modification 2: DON'T pass resolvers here,for mergedSchema has it already!!..
const server = new ApolloServer({
schema:mergedSchema,context
});
参考:https://hasura.io/blog/the-ultimate-guide-to-schema-stitching-in-graphql-f30178ac0072/#a473
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。