GraphQL 渐进学习 07-graphql-node-server-模块化

GraphQL 渐进学习 07-graphql-node-server-模块化

目标

  • 为了便于维护,模块化 node 服务端 代码
  • 代码抽取层次分为
    • schema 定义
      • 类型
      • 业务对象
      • 查询
      • 更改
    • resolvers 实现
      • 查询
      • 方法
    • typeResolvers 实现
      • 自定义类型
      • 标准类型
    • utils 工具
      • mock

代码

目录结构

.
├── index.js                                | 主程序
├── resolvers                               | 查询 更新 实现
│   ├── Mutations.js                        | 更新
│   ├── Querys.js                           | 查询
│   └── index.js                            | 入口
├── schema                                  | 模型定义
│   ├── business                            | 业务定义
│   │   ├── comment.graphql                 | 评论
│   │   └── post.graphql                    | 文章
│   └── std                                 | 类型定义
│       ├── Mutation.graphql                | 更新
│       ├── Query.graphql                   | 查询
│       ├── enum.graphql                    | 枚举
│       ├── interface.graphql               | 接口
│       ├── scalar.graphql                  | 自定义类型
│       └── union.graphql                   | 联合
├── typeResolvers                           | 类型实现
│   ├── index.js                            | 入口
│   ├── interfaces.js                       | 接口
│   ├── scalars.js                          | 自定义类型
│   ├── types.js                            | 业务类型
│   └── unions.js                           | 联合
└── utils                                   | 工具
    └── mock.js                             | 模拟
  • 说明
    • 这是按 Graphql 组件层次来切分的,适合小业务项目
    • 如果是业务系统庞大,就需要外面套一层 子业务模块 的目录
    • 如果业务很微小,可以把目录下的多个文件合成一个,切的过于细小也带来维护的麻烦,具体尺度自己感觉哈

步骤

1. schema 定义采用文件扩展名 .graphql

规范点总有好处的,你可以写成 .gpl 或者 .graphql

2. 安装 VSCode 语法支持插件 GraphQL for VSCode

  • 安装地址 GraphQL for VSCode

  • 语法高亮
    [图片上传失败...(image-946a1-1526182107083)]

  • 前去定义
    [图片上传失败...(image-7b878c-1526182107083)]

  • 自动完成代码
    [站外图片上传中...(image-f7dbb3-1526182107083)]

我主要用语法高亮

3. 安装 npm 插件 require-graphql-file 支持模块化 .graphql 文件

  • 安装插件
npm i -S require-graphql-file
  • 使用,打开 index.js
import requireGraphQLFile from 'require-graphql-file'
...
// 读取 schema
const typeDefs = [
  requireGraphQLFile('./schema/std/scalar'),
  // requireGraphQLFile('./schema/std/enum'),
  // requireGraphQLFile('./schema/std/interface'),
  // requireGraphQLFile('./schema/std/union'),
  requireGraphQLFile('./schema/business/post'),
  requireGraphQLFile('./schema/business/comment'),
  requireGraphQLFile('./schema/std/Query'),
  requireGraphQLFile('./schema/std/Mutation')
]
...
// 合并 schema
const schema = makeExecutableSchema({
  typeDefs,
  ...
})

其实就是读取 文本 文件,然后合并了传参给 makeExecutableSchema

4. 编写 schema 定义

  • 业务类型组件类型 切分

    • 因为 业务类型 的文件名都是有意义的业务名称 Post Comment

    • 组件类型 的名字可以很确定 enum interface union scalar 方便查找

  • 目录文件

├── schema                                  | 模型定义
│   ├── business                            | 业务定义
│   │   ├── comment.graphql                 | 评论
│   │   └── post.graphql                    | 文章
│   └── std                                 | 类型定义
│       ├── Mutation.graphql                | 更新
│       ├── Query.graphql                   | 查询
│       ├── enum.graphql                    | 枚举
│       ├── interface.graphql               | 接口
│       ├── scalar.graphql                  | 自定义类型
│       └── union.graphql                   | 联合

见上文

5. 编写 分解器 代码

  • 我认为 分解器 代码有两种

    • 1 实现 Query查询 Mutations更新 , 我都放在 resolvers 目录
    • 2 定义各种类型 interface scalar type union , 都放在 typeResolvers 目录
  • 目录文件

├── resolvers                               | 查询 更新 实现
│   ├── Mutations.js                        | 更新
│   ├── Querys.js                           | 查询
│   └── index.js                            | 入口
├── typeResolvers                           | 类型实现
│   ├── index.js                            | 入口
│   ├── interfaces.js                       | 接口
│   ├── scalars.js                          | 自定义类型
│   ├── types.js                            | 业务类型
│   └── unions.js                           | 联合
import resolvers from './resolvers'
import typeResolvers from './typeResolvers'
...
// 合并 schema
const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
  typeResolvers,
  resolverValidationOptions: {
    requireResolversForResolveType: false
  }
})
  • resolvers typeResolvers 目录下写了 index.js 进行合并

6. 工具 mock

  • 为了测试方便,我都用 mock 数据

如何模拟请移步 06-graphql-采用-mockjs-mock数据

测试

# 请求
{
  posts {
    id
    title
    content
    author
    addtime
    comments {
      id
      message
      author
      addtime
    }
  }
}

# 输出
{
  "data": {
    "posts": [
      {
        "id": 90932,
        "title": "十分长现维整",
        "content": "常气火热成或",
        "author": "文霞",
        "addtime": "10:21:14",
        "comments": [
          {
            "id": 30874,
            "message": "十称军题片格员主实",
            "author": "局反重间半何",
            "addtime": "22:05:28"
          },
          {
            "id": 7088,
            "message": "克此快候己林层省",
            "author": "备从当提属",
            "addtime": "15:45:27"
          },
          {
            "id": 74989,
            "message": "部织温制流统响教广",
            "author": "领重你包计",
            "addtime": "03:06:03"
          },
          {
            "id": 24501,
            "message": "识消己满军子酸",
            "author": "调始相内向中取造还比",
            "addtime": "05:15:38"
          },
          {
            "id": 91765,
            "message": "重开流报着色运党快但",
            "author": "儿动内心放改声口立",
            "addtime": "04:53:28"
          },
          {
            "id": 48731,
            "message": "气即感共就林始",
            "author": "进在层只作",
            "addtime": "10:29:44"
          }
        ]
      },
      {
        "id": 67359,
        "title": "开被几此图位便目作",
        "content": "应众级向由把",
        "author": "孟杰",
        "addtime": "16:49:30",
        "comments": [
          {
            "id": 28432,
            "message": "大命格我就战历",
            "author": "亲但美在号场米商",
            "addtime": "13:18:11"
          },
          {
            "id": 36258,
            "message": "红条由近的备级",
            "author": "自团人老以音状装指号",
            "addtime": "13:17:17"
          },
          {
            "id": 90117,
            "message": "么整片外习达离",
            "author": "满步该律特",
            "addtime": "16:10:35"
          },
          {
            "id": 14731,
            "message": "场等九百市很安",
            "author": "白石价和林风农",
            "addtime": "18:33:41"
          },
          {
            "id": 23523,
            "message": "二面化权文及照万",
            "author": "运现里新政过铁",
            "addtime": "17:51:59"
          },
          {
            "id": 77423,
            "message": "划群低矿流按看实养",
            "author": "个为然工些效",
            "addtime": "21:56:41"
          }
        ]
      }
    ]
  }
}

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容