Node.js 如何使用Apollo分离GraphQL模式和解析器文件?
我有一个简单的GraphQL Apollo服务器,当它都在一个文件中时可以工作,但是当将模式和解析器“模块化”到它们自己的文件时,我很难让它工作Node.js 如何使用Apollo分离GraphQL模式和解析器文件?,node.js,mongodb,graphql,apollo,apollo-server,Node.js,Mongodb,Graphql,Apollo,Apollo Server,我有一个简单的GraphQL Apollo服务器,当它都在一个文件中时可以工作,但是当将模式和解析器“模块化”到它们自己的文件时,我很难让它工作 /index.js require('dotenv').config() const { MongoClient } = require('mongodb') const { ApolloServer, makeExecutableSchema } = require('apollo-server') const { Query } = requir
/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}.`)
})
})
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
}
/schema.graphql
type CourseType {
_id: String!
name: String!
}
type Query {
courseType(_id: String): CourseType
courseTypes: [CourseType]!
}
/resolvers/Query.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}.`)
})
})
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
文件时,我得到一个错误:UnhandledPromisejectionWarning:GraphQLError:Syntax error:无法解析意外字符“
。似乎我没有正确加载/使用架构文件。如果阿波罗服务器能够自己处理,我希望在不添加更多库的情况下实现这一点。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
请一次只问一个问题,则可以通过这种方式加载多个架构。您的第二个问题与第一个问题无关,应单独发布。@TalZ抱歉,第二个问题已删除。谢谢!不知道typeDefs
只是在寻找字符串。问:apollo server
中是否有一种方法可以为模式解析.graphql
文件,而不必将模式.graphql
封装为字符串?我不知道是否有内置方法,但您可以使用fs.readFile(…)