使用graphql-tools和GitHub将GraphQL服务器和模式定义分离

目录

    1. 目录

 

    1. 前言

正文

将GraphQL服务器和模式定义分离

创建用于模式定义的GitHub仓库
从GitHub中读取模式定义以供GraphQL服务器使用

总结

序言

经纬

在尝试使用GraphQL进行应用程序开发时,我发现GraphQL服务器和架构定义融为一体,使开发变得困难,因此我进行了分离方法的研究和尝试。

目标读者

    • GraphQLサーバとスキーマ定義を分離したい人

 

    • Node.jsを使用してGraphQLサーバを構築したい人

graphql-toolsを使用している/使用を検討している人

GitHubを使用してリポジトリを管理している人

这次要使用的东西的说明

以下是关于本次使用的技术要素的简要说明。

GraphQL 是什么?

GraphQL是一种用于与数据源进行通信的查询语言,可以以以下形式进行描述:

# 型定義
type Exmaple {
    id: ID!
    requiredString: String!
    string: String
}

# 参照
type Query {
    read(id: ID!, string: String): Exmaple
}

# 作成/更新/削除
type Mutation {
    create(id: ID!, string: String): Exmaple
    update(id: ID!, string: String): Exmaple
    delete(id: ID!): Exmaple
}

您可以通过组合标量类型来创建自定义类型,
您还可以为查询定义数据引用功能的接口定义,
以及为编辑数据功能的接口定义来创建变化。

由于GraphQL的模式定义本身就是接口定义文档,因此可以节省文档编写的时间。

GraphQL服务器指的是可以使用GraphQL进行通信的服务器应用程序。

graphql-tools是什么?

graphql-tools是一个作为Node.js的包而创建的GraphQL实用工具集合。

這次使用它來讀取已分離的架構定義。

This question.

将GraphQL服务器和模式定义分离

创建一个用于定义架构的GitHub存储库。

首先,在GitHub上创建一个存储库来管理已分离的模式定义。

创建存储库时,将模式定义本身与功能单位分离,并在不同的存储库中进行管理。

read_schema.png

GraphQL的模式定义必须将引用功能定义为查询类型,将编辑功能定义为变异类型,因此通常需要将其汇总在一个文件中进行定义。

然而,使用graphql-tools工具,可以合并并使用不同的模式定义。

这样做有以下好处

    • スキーマ定義が機能単位で分割されるため拡張/修正しやすくなる

新規追加時/修正時に他の定義への影響をなくすことができる

スキーマ定義を利用する側のアプリケーションが使用する定義を選択できる

マイクロサービスアーキテクチャでアプリケーションを構築することも可能になる

在GraphQL服务器中从GitHub读取模式定义。

如果能够创建管理模式定义的存储库,我们将在GraphQL服务器端添加用于获取模式定义的处理程序。

因为希望使用graphql-tools,所以将在Node.js上创建GraphQL服务器。
本文创建时使用的Node.js版本如下。

node -v                                                     
v16.17.1
npm -v
8.15.0

首先我们需要安装所需的库。因为我们想要从GitHub获取模式定义,所以我们将使用github-loader和load库。

npm i @graphql-tools/github-loader @graphql-tools/load

使用已安装的github-loader和load库来获取和读取模式定义文件。
请注意,包含安全信息的部分已记录在环境变量中获取的方式。

import { GithubLoader } from '@graphql-tools/github-loader';
import { loadSchema } from '@graphql-tools/load';

const GIT_TOKEN = process.env.GIT_TOKEN;
const USER_NAME = process.env.USER_NAME;

const typeDefs = await loadSchema(
      [
        `github:${USER_NAME}/feature-a-schema#v1:schema.graphql`,
        `github:${USER_NAME}/feature-b-schema#v1:schema.graphql`,
        `github:${USER_NAME}/feature-c-schema#v1:schema.graphql`
      ],
      {
        loaders: [new GithubLoader()],
        token: GIT_TOKEN
      }
    );

在中国本地化的方式中,使用load库的loadSchema方法来加载架构,需要指定loader,因此指定github-loader。

在github-loader中,指针模式(指向存放模式定义的位置)的描述方法如下:

    `github:${リポジトリのオーナー名}/${リポジトリ名}#${ブランチ名 or タグ}:${スキーマ定義ファイル名}`

通过指定GitHub仓库和模式定义文件,可以读取在外部管理的模式定义。此外,还可以指定标签,这样即使模式定义发生更改,也不会对应用程序产生影响,只需更改标签即可。

可以同时写入多个要加载的模式定义,
加载的定义将自动合并为一个模式定义可以使用。

您也可以将已加载的模式定义传递给Apollo Server并启动GraphQL服务器。

通过这个方法,我们成功地将模式定义的开发与GraphQL服务器的开发分离出来。

摘要

    • github-toolsを使用することでGraphQLサーバとスキーマ定義を分離できる

分離することでスキーマ定義を変更しやすくなる
スキーマ定義自体も分割管理できるようになる

github-loaderを使用することでGitHubから直接スキーマ定義を読み込むことができる

我目前只在个人开发中进行了尝试,但考虑到在团队开发中可能有一些优势,如果有机会的话,我会尝试将其引入。

广告
将在 10 秒后关闭
bannerAds