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
- 安装地址
- 语法高亮
- 前去定义
- 自动完成代码
我主要用语法高亮
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
目录
- 1 实现
- 目录文件
├── 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" } ] } ] }}