博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GraphQL 渐进学习 07-graphql-node-server-模块化
阅读量:6323 次
发布时间:2019-06-22

本文共 6176 字,大约阅读时间需要 20 分钟。

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

  • 安装地址
  • 语法高亮
    语法高亮
  • 前去定义
    goto-definition
  • 自动完成代码
    autocomplete
我主要用语法高亮

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

  • 安装插件
npm i -S require-graphql-file
  • 使用,打开 index.js
import requireGraphQLFile from 'require-graphql-file'...// 读取 schemaconst 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')]...// 合并 schemaconst 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'...// 合并 schemaconst schema = makeExecutableSchema({  typeDefs,  resolvers,  typeResolvers,  resolverValidationOptions: {    requireResolversForResolveType: false  }})
  • resolvers typeResolvers 目录下写了 index.js 进行合并

6. 工具 mock

  • 为了测试方便,我都用 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"          }        ]      }    ]  }}

参考

转载地址:http://qlvaa.baihongyu.com/

你可能感兴趣的文章
ovs之组网实验
查看>>
union的使用(转)
查看>>
vue的表单的简单介绍 input radio checkbox等表单特性
查看>>
vue中自定义指令vue.direvtive,自定义过滤器vue.filter(),vue过渡transition
查看>>
django具体操作(七)
查看>>
俄总统参观卡巴斯基实验室 强调本土产品策略
查看>>
在ASP.NET MVC3中使用“.NET研究”EFCodeFirst 1.0
查看>>
互联网进病毒高发期 黑客瞄准网络春晚
查看>>
VMware workstation 下Hadoop伪分布式模式安装
查看>>
关于Android activity生命周期
查看>>
OpenModelica仿真
查看>>
robots.txt
查看>>
Redis客户端之Spring整合Jedis
查看>>
node服务搭建流程
查看>>
ASP.NET C# 访问Access、Xml等数据库
查看>>
python-logging模块详解
查看>>
Git -- 新增分支添加新功能
查看>>
SharePoint 2013 页面访问,Url中间多一段"_layouts/15/start.aspx#"
查看>>
jstree 树形菜单问题
查看>>
JavaScript词法分析(尽力理解)
查看>>