Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用Apollo分离GraphQL模式和解析器文件?_Node.js_Mongodb_Graphql_Apollo_Apollo Server - Fatal编程技术网

Node.js 如何使用Apollo分离GraphQL模式和解析器文件?

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

我有一个简单的GraphQL Apollo服务器,当它都在一个文件中时可以工作,但是当将模式和解析器“模块化”到它们自己的文件时,我很难让它工作

/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(…)