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
- 语法高亮
- 前去定义
- 自动完成代码
我主要用语法高亮
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
目录
- 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' ... // 合并 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" } ] } ] } }
参考
相关推荐
sichenglain 2020-10-27
zhyue 2020-09-28
0linker 2020-09-01
sichenglain 2020-05-19
FZEROF 2020-04-26
zehuawong 2020-04-07
zehuawong 2020-02-11
acloudhuang 2020-01-18
IT新技术 2020-01-07
wikowin 2019-12-15
FZEROF 2019-12-09
sichenglain 2019-11-21
chzh0 2019-11-19
FZEROF 2019-11-19
月光恋九霄 2019-11-18
zehuawong 2019-11-08
HelloWood 2018-09-08
zehuawong 2018-09-08
0linker 2019-10-31