服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

快速入门 GraphQL:一个接口实现 CRUD

日期: 来源:神光的编程秘籍收集编辑:神说要有光zxg

作为前端开发,想必经常做的事情就是:调接口、画页面、调接口、画页面...

调用的接口大概率是 restful 的,也就是类似这种:

/students 查询所有学生信息

/student/1 查询 id 为 1 的学生信息

上面说的是 get 请求。

如果对 /student/1 发送 POST、PUT、DELETE 请求,就分别代表了新增、修改、删除。

这就是 restful 风格的 web 接口。

这种接口返回什么信息是服务端那边决定的,客户端只是传一下参数。

而不同场景下需要的数据不同,这时候可能就得新开发一个接口。特别是在版本更新的时候,接口会有所变动。

这样就很容易导致一大堆类似的接口。

facebook 当时也遇到了这个问题,于是他们创造了一种新的接口实现方案:GraphQL。

用了 GraphQL 之后,返回什么数据不再是服务端说了算,而是客户端自己决定。

服务端只需要提供一个接口,客户端通过这个接口就可以取任意格式的数据,实现 CRUD。

比如想查询所有的学生,就可以这样:

想再查询他们的年龄,就可以这样:

想查询老师的名字和他教的学生,就可以这样:

而这些都是在一个 http 接口里完成的!

感受了 GraphQL 的好处了没?

一个 http 接口就能实现所有的 CRUD!

那这么强大的 GraphQL 是怎么实现的呢?

我们先写个 demo 快速入门一下:

facebook 提供了 graphql 的 npm 包,但那个封装的不够好,一般我们会用基于 graphql 包的 @apollo/server 和 @apollo/client 的包来实现 graphql。

首先引入这个包:

import { ApolloServer } from '@apollo/server';

然后写一段这样的代码:

import { ApolloServer } from '@apollo/server';

const typeDefs = `
  type Student {
    id: String,
    name: String,
    sex: Boolean
    age: Int
  }

  type Teacher {
    id: String,
    name: String,
    age: Int,
    subject: [String],
    students: [Student]
  }

  type Query {
    students: [Student],
    teachers: [Teacher],
  }

  schema {
    query: Query
  }
`;

比较容易看懂,定义了一个 Student 的对象类型,有 id、name、sex、age 这几个字段。

又定义了一个 Teacher 的对象类型,有 id、name、age、subject、students 这几个字段。students 字段是他教的学生的信息。

然后定义了查询的入口,可以查 students 和 teachers 的信息。

这样就是一个 schema。

对象类型和对象类型之间有关联关系,老师关联了学生、学生也可以关联老师,关联来关联去这不就是一个图么,也就是 graph。

GraphQL 全称是 graph query language,就是从这个对象的 graph 中查询数据的。

现在我们声明的只是对象类型的关系,还要知道这些类型的具体数据,取数据的这部分叫做 resolver。

const students = [
    {
      id: '1',
      name: async () => {
        await '取数据';
        return '光光'
      },
      sex: true,
      age: 12
    },
    {
      id: '2',
      name:'东东',
      sex: true,
      age: 13
    },
    {
      id: '3',
      name:'小红',
      sex: false,
      age: 11
    },
];

const teachers = [
  {
    id: '1',
    name: '神光',
    sex: true,
    subject: ['体育', '数学'],
    age: 28,
    students: students
  }
]

const resolvers = {
    Query: {
      students: () => students,
      teachers: () => teachers
    }
};

resolver 是取对象类型对应的数据的,每个字段都可以写一个 async 函数,里面执行 sql、访问接口等都可以,最终返回取到的数据。

当然,直接写具体的数据也是可以的。

这里我就 student 里那个 name 用 async 函数的方式写了一下。

这样有了 schema 类型定义,有了取数据的 resovler,就可以跑起 graphql 服务了。

也就是这样:

import { startStandaloneServer } from '@apollo/server/standalone' 

const server = new ApolloServer({
    typeDefs,
    resolvers,
});
  
const { url } = await startStandaloneServer(server, {
    listen: { port: 4000 },
});
  
console.log(`

相关阅读

  • 降雨!降雪!未来三天……

  • 今天09:12:52我们进入清明节气今天放假一天白天我省多地天气放晴春意正浓
    特别适合出行但是到了今天晚上又一波冷空气影响我省多地预计今天夜间到明天白天我省多地会再迎来
  • 夜读丨一静 、二平 、三忍 、四让、五淡

  • 来源:民生周刊(ID:msweekly)整理自儒风大家(ID: rufengdajia)图片:视觉中国编辑:刘倩本文系转载,如有版权问题请联系本账号
    古人为人、处事、修身,都有独特的章法:一静、二平、三忍、四
  • 我们需要怎样的生命教育?

  • 文|余晓
    95后的任赛男在郑州一家淘宝店做寿衣模特,因被媒体报道冲上热搜榜,受到广泛关注。出圈后除了光环也带来困扰,网友有点赞的,也有说她阴气重的。清明节前夕,她坦言自己曾因
  • 2023年清明节创意斗稿

  • 关注「地产全案」公众号,每天收看全国顶尖创意作品案例~| 项目品牌斗稿| 创意公司斗稿 各类海报参考大全 4月节日 | 愚人节 清明节 谷雨 地球日 读书日阶段参
  • 全国唯一的“医疗特区”,独特之处是……

  • 在海南,有一个全国唯一的“医疗特区”——博鳌乐城国际医疗旅游先行区(以下简称“乐城先行区”),自2013年经国务院批准设立以来,吸引了医疗机构、药械企业、医学院校、保险公司等
  • 2023.04.05北京租房信息汇总

  • 今日房源速览2023.04.051.1号线传媒大学地铁站附近2.8号线朱辛庄北区3.房山区长阳镇朱岗子村4.1号线梨园云景豪庭小区5.8号线回龙观东大街龙锦苑东五区6.14号线将台兆维小区
  • 20岁女子在泰国遭绑架遇害,警方通报——

  • 4月5日,浙江温州警方发布通报:3月31日,接我市居民报案称,其女儿(金某,20岁,浙江温州人)在泰国被绑架,绑匪索要50万赎金。接报后,我市公安机关依法立案侦查。经工作并通过国际警务合

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 痛惜!3名少年不幸遇难

  • 今日#女孩跳江获救3名救援小伙溺亡#引起很多网友的关注4月2日凌晨5时许,四川阆中嘉陵江边,发生一起悲剧。一名女孩跳江轻生,三名小伙下水救援。遗憾的是,女孩获救,三名参与救援的
  • 快速入门 GraphQL:一个接口实现 CRUD

  • 作为前端开发,想必经常做的事情就是:调接口、画页面、调接口、画页面...调用的接口大概率是 restful 的,也就是类似这种:/students 查询所有学生信息/student/1 查询 id 为 1 的
  • 品读∣人到中年,方懂清明

  • 作者:景桥来源:你的景和我的桥(ID:jing6qiao)梨花风起正清明。转眼,又是一年雨纷纷时节。年少,“听雨歌楼上,红烛昏罗帐”,还不懂清明的庄严肃穆、清洁明净。人到中年,上有老、下有小,
  • 【第2906期】Prompt Engineering: 循循善诱

  • 前言有了 AI,将来交互可能会有另一种形式了。今日前端早读课文章由 @LMJ1995 翻译授权转载分享。正文从这开始~~自从 GPT3 问世以来,“预训练 + 微调” 的模式被广泛应用在各类
  • 泽连斯基首次正式访问,有人“搞破坏”?

  • 据外媒报道,当地时间5日,乌克兰总统泽连斯基抵达波兰。这是泽连斯基第一次正式访问波兰,此前仅在波兰过境。报道称,泽连斯基访问波兰之际,乌克兰正计划反攻。波兰是乌克兰的亲密