首页 > 解决方案 > 如何使用 `apollo-server` 加载 .graphql 文件?

问题描述

我目前正在使用单独的.graphql文件加载 GraphQL 架构,但它封装在字符串中:

schema.graphql

const schema = `
  type CourseType {
    _id: String!
    name: String!
  }

  type Query {
    courseType(_id: String): CourseType
    courseTypes: [CourseType]!
  }
`

module.exports = schema

然后将其用于apollo-server

index.js

const { ApolloServer, makeExecutableSchema } = require('apollo-server')
const typeDefs = require('./schema.graphql')

const resolvers = { ... }

const schema = makeExecutableSchema({
  typeDefs: typeDefs,
  resolvers
})

const server = new ApolloServer({
  schema: schema
})

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}.`)
})

有没有办法简单地加载一个看起来像这样的 .graphql? schema.graphql

type CourseType {
  _id: String!
  name: String!
}

type Query {
  courseType(_id: String): CourseType
  courseTypes: [CourseType]!
}

然后它会在index.js? 我注意到graphql-yoga支持这一点,但想知道是否支持apollo-server。我在文档中的任何地方都找不到它。我也不能fs.readFile上班。

标签: node.jsgraphqlapolloapollo-server

解决方案


如果您在.graphql文件中定义类型定义,则可以通过以下几种方式之一读取它:

1.)自己阅读文件:

const { readFileSync } = require('fs')

// we must convert the file Buffer to a UTF-8 string
const typeDefs = readFileSync('./type-defs.graphql').toString('utf-8')

2.)利用图书馆喜欢graphql-tools为你做这件事:

const { loadDocuments } = require('@graphql-tools/load');
const { GraphQLFileLoader } = require('@graphql-tools/graphql-file-loader');

// this can also be a glob pattern to match multiple files!
const typeDefs = await loadDocuments('./type-defs.graphql', { 
    file, 
    loaders: [
        new GraphQLFileLoader()
    ]
})

3.) 使用babel 插件webpack 加载器

import typeDefs from './type-defs.graphql'

推荐阅读