如何使用 Apollo 分离 GraphQL 模式和解析器文件?
How to separate GraphQL schema and resolver files using Apollo?
我有这个简单的 GraphQL Apollo 服务器,当它全部在一个文件中时,它可以工作,但是当 "modularizing" 模式和解析器到它们自己的文件时,我无法让它工作。
/index.js
require('dotenv').config()
const { MongoClient } = require('mongodb')
const { ApolloServer, makeExecutableSchema } = require('apollo-server')
const { Query } = require('./resolvers/Query')
// database connection
MongoClient.connect(process.env.DB_URL, {
poolSize: 25,
useUnifiedTopology: true,
wtimeout: 2500
}).catch(error => {
console.log('Error connecting to MongoDB.', error.stack)
process.exit(1)
}).then(async client => {
console.log(`Connected to database: ${process.env.DB_NAME}`)
const dbConnection = client.db(process.env.DB_NAME)
const resolvers = {
Query
}
const schema = makeExecutableSchema({
typeDefs: './schema.graphql',
resolvers
})
const server = new ApolloServer({
schema: schema
})
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}.`)
})
})
/schema.graphql
type CourseType {
_id: String!
name: String!
}
type Query {
courseType(_id: String): CourseType
courseTypes: [CourseType]!
}
/resolvers/Query.js
const { ObjectId } = require('mongodb')
const courseTypesCollection = dbConnection.collection(process.env.DB_COLLECTION_COURSE_TYPES)
const Query = {
courseType: async (root, { _id }) => {
return courseTypesCollection.findOne(ObjectId(_id))
},
courseTypes: async () => {
return courseTypesCollection.find({}).toArray()
}
}
module.exports = {
Query
}
当我尝试 运行 index.js
文件时,出现错误:UnhandledPromiseRejectionWarning: GraphQLError: Syntax Error: Cannot parse the unexpected character "."
。这好像我没有正确 loading/using 模式文件。如果 apollo-server
可以自己处理这个问题,我希望在不添加更多库的情况下工作。
makeExecutableSchema
期望 typeDefs
是类型定义的字符串,代表解析为 AST 的类型定义的 DocumentNode
对象,前者之一的数组将是融合在一起。在这里,您似乎将文件路径传递给 typeDefs
而不是文件内容。
您可以将 /schema.graphql
文件更改为一个简单的代码文件,例如:
const schema = `
type CourseType {
_id: String!
name: String!
}
type Query {
courseType(_id: String): CourseType
courseTypes: [CourseType]!
}
`
module.exports = schema
然后加载到 typedef
const graphQLSchema = require('./schema.graphql')
//...
const schema = makeExecutableSchema({
typeDefs: graphQLSchema,
resolvers
})
如果将数组传递给 typeDefs
,则可以通过这种方式加载多个模式
我有这个简单的 GraphQL Apollo 服务器,当它全部在一个文件中时,它可以工作,但是当 "modularizing" 模式和解析器到它们自己的文件时,我无法让它工作。
/index.js
require('dotenv').config()
const { MongoClient } = require('mongodb')
const { ApolloServer, makeExecutableSchema } = require('apollo-server')
const { Query } = require('./resolvers/Query')
// database connection
MongoClient.connect(process.env.DB_URL, {
poolSize: 25,
useUnifiedTopology: true,
wtimeout: 2500
}).catch(error => {
console.log('Error connecting to MongoDB.', error.stack)
process.exit(1)
}).then(async client => {
console.log(`Connected to database: ${process.env.DB_NAME}`)
const dbConnection = client.db(process.env.DB_NAME)
const resolvers = {
Query
}
const schema = makeExecutableSchema({
typeDefs: './schema.graphql',
resolvers
})
const server = new ApolloServer({
schema: schema
})
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}.`)
})
})
/schema.graphql
type CourseType {
_id: String!
name: String!
}
type Query {
courseType(_id: String): CourseType
courseTypes: [CourseType]!
}
/resolvers/Query.js
const { ObjectId } = require('mongodb')
const courseTypesCollection = dbConnection.collection(process.env.DB_COLLECTION_COURSE_TYPES)
const Query = {
courseType: async (root, { _id }) => {
return courseTypesCollection.findOne(ObjectId(_id))
},
courseTypes: async () => {
return courseTypesCollection.find({}).toArray()
}
}
module.exports = {
Query
}
当我尝试 运行 index.js
文件时,出现错误:UnhandledPromiseRejectionWarning: GraphQLError: Syntax Error: Cannot parse the unexpected character "."
。这好像我没有正确 loading/using 模式文件。如果 apollo-server
可以自己处理这个问题,我希望在不添加更多库的情况下工作。
makeExecutableSchema
期望 typeDefs
是类型定义的字符串,代表解析为 AST 的类型定义的 DocumentNode
对象,前者之一的数组将是融合在一起。在这里,您似乎将文件路径传递给 typeDefs
而不是文件内容。
您可以将 /schema.graphql
文件更改为一个简单的代码文件,例如:
const schema = `
type CourseType {
_id: String!
name: String!
}
type Query {
courseType(_id: String): CourseType
courseTypes: [CourseType]!
}
`
module.exports = schema
然后加载到 typedef
const graphQLSchema = require('./schema.graphql')
//...
const schema = makeExecutableSchema({
typeDefs: graphQLSchema,
resolvers
})
如果将数组传递给 typeDefs