按照cnode-api的顺序来的, 基本只是做了包装,
需要修改的可以看代码,做出修改. 通过 graphql 的 rest-wrapper resolver 包装以后,就可以获得 graphql的一些很好的特征了. 因为没有数据写入的Grpahql 的数据库,所以所有的操作都用的是query. 没有用 mutate. 因为最终还是访问的 REST API.
这的graphql采用的是 graphcool 的服务器, 尽管试, 没有写入操作.
Graphcool-cnode-server graphiQL地址
服务器的初始化可以参考这里Graphcool Server
可以选择部署在本地docker 中, 如果用于测试可以 直接部署在云上.
大致的流程如下在 GraphQL客户端或者是 GraphiQL执行的操作,会经过 resolver 函数的处理, resolver 实际是 express 服务器, 在这里可以执行数据库操作,或者是执行转发任务, 如果是为 API 提供服务, 就使用转发. 我们这里就是转发.
主题
1
get/tpoics 主题首页
就是数据列表,tab用于分类, page 用于分页
allTopics.graphql
1 | //⛔️有些字段没有列出,可以做修改 |
allTopics.js
1 | require('isomorphic-fetch'); |
查询示意图
注意事项
graphiQL里执行的操作就是最好的文档, 这里执行的查询结果, 在其他地方可以完全复现,如果复现不了,就是你的客户端代码由问题. 在客户端我们可以使用 graphql-tag 的方法把这段查询的字符串给拼接出来.如果拼接没有问题, 得到的结果是完全一样的
2
get/topics主题详情
getOneTopic.graphql
1 | type OneTopicPayload { |
getOneTopic.js
1 | require('isomorphic-fetch') |
查询
3
新建主题 post/topics
createTopic.graphql
1 | type createTopicPayload { |
createTopic.js
1 | 'use latest' |
查询示意
4
编辑主题 post/topics/update
updateTopic.graphql
1 | type updateTopicPayload { |
updateTopic.js
1 | 'use latest'; |
查询结果
和创建基本是一样的
收藏
1
收藏主题 get topic_collection/collect
createTopicCollection.graphql
1 | type createTopicCollectionPayload { |
createTopicCollection.js
1 | 'use latest' |
2
取消主题收藏 post/topic_collection/de_collect
cancelTopicCollection.graphql
1 | type cancelTopicCollectionPayload { |
cancelTopicCollection.js
1 | 'use latest' |
3
主题首页 get/topic_collection/:loginname
allCollections.graphql
1 | type AllCollectionsPayload { |
allCollections.js
1 | require('isomorphic-fetch') |
查询结果
评论
1
新建评论 post/ topic/:topic_id/replies
createReplies.graphql
1 | type createRepliesPayload { |
createReplies.js
1 | 'use latest' |
查询结果
2
为评论点赞 post /reply/:reply_id/ups
createUps.graphql
1 | type createUpsPayload { |
createUps.js
1 | 'use latest' |
查询结果
用户
1
用户详情 get /user/:loginname
getUserInfo.graphql
1 | type UserInfoPayload { |
getUserInfo.js
1 | require('isomorphic-fetch') |
查询结果
消息通知
获取未读消息 get/message/count
getMessageCount.graphql
1 | type MessageCountPayload { |
getMessageCount.js
1 | require('isomorphic-fetch') |
2
获取已读和未读消息 get /messages
getMessages.graphql
1 | type MessagesPayload { |
getMessages.js
1 | require('isomorphic-fetch') |
查询结果
3
全部标记已读 post /message/mark_all
markAll.graphql
1 | type markAllPayload { |
markAll.js
1 | 'use latest'; |
查询结果
后记,如果要在 客户端使用 GraphQL查询,怎么操作呢?
我使用的的 Apollo-client的方法
①
在顶层组件导入配置文件
1 | import { ApolloProvider } from 'react-apollo' |
②
实际是单一数据来源的 store, 在组件中可以直接使用查询了
1 | import { graphql } from 'react-apollo'; |
GraphQL在这里不仅仅是对 API进行了包装这么简单,它大概提供了一下的好处:
①
:严格了类型,类型错误,或者缺少都会报错②
:可以根据需求灵活的选择需要返回的数据,例如 列表并不需要 cotent,我们可以选择性的在 graphql 返回数据时省掉这一个字段. 如果 graphQL 服务器和 REST 服务器在同一个主机下,效率会大大提高.③
:为 API生成了一个单一的入口,多个查询可以一次返回. 减少请求次数④
: 提供了强有力的测试和说明工具: graphiql, 统一前后端的操作.⑤
: graphQL自带说明性质, 有很好的代码提示和自动完成功能. 后续的客户端也会提供这个功能, 出错的机会大大降低了