【问题标题】:How to separate GraphQL schema and resolver files using Apollo?如何使用 Apollo 分离 GraphQL 模式和解析器文件?
【发布时间】:2020-09-28 22:32:16
【问题描述】:

我有这个简单的 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}.`)
  })
})

/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 "."。这似乎我没有正确加载/使用模式文件。如果apollo-server 可以自行处理,我希望在不添加更多库的情况下使其正常工作。

【问题讨论】:

  • 请一次只问一个问题。您的第二个问题与第一个问题无关,应单独发布。
  • @TalZ 抱歉,第二个问题已删除。

标签: node.js mongodb graphql apollo apollo-server


【解决方案1】:

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,您可以通过这种方式加载多个模式

【讨论】:

  • 谢谢!不知道typeDefs 只是在寻找一个字符串。问题:是否有来自apollo-server 的方法可以解析架构的.graphql 文件,而不必将schema.graphql 封装为字符串?
  • 我不知道是否有内置方法,但是您可以使用fs.readFile(...)自己轻松做到这一点
猜你喜欢
  • 2019-02-26
  • 2019-04-17
  • 2021-07-25
  • 2020-09-11
  • 2019-02-08
  • 2020-03-08
  • 2021-01-25
  • 2019-04-06
  • 2021-07-29
相关资源
最近更新 更多