国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

GraphQL的JavaScript實現graphql-js應用舉例

開發 開發工具
之前那篇文章一直有提到 GraphQL 是一個概念,每個語言可以有自己實現它的方式。因為,我是搞前端的,對 JavaScript 比較熟悉,所以,這里就用 graphql-js(GraphQL 的 JavaScript 實現)來舉例。

系列文章:

  1. GraphQL 核心概念
  2. graphql-js 淺嘗(本文)

常言道,實踐是檢驗真理的唯一標準。

上一篇文章講了 GraphQL 的核心概念,所提到的一些例子都是理論化的,并沒有實際代碼做支撐,就好像在畫一個大餅,總是讓人不那么信服。

它真的有那么神奇嗎?那就同我一起看下去,用事實說話。

之前那篇文章一直有提到 GraphQL 是一個概念,每個語言可以有自己實現它的方式。因為,我是搞前端的,對 JavaScript 比較熟悉,所以,這里就用 graphql-js(GraphQL 的 JavaScript 實現)來舉例。

Hello World

遵循傳統,***個例子必須是 Hello World。

首先,安裝就不用多說了。 

  1. npm install graphql-js --save 

那這個例子該怎么設計哪?假設,查詢一個 hello 字符串,就返回一個 world 字符串,很明顯 type 的結構就該是這樣 

  1. type HelloWorld { 
  2.  
  3. hello: String 
  4.  

 如何實現這個 HelloWorld 類型哪?graphql-js 已經定義好了基礎類,我們直接調用就行。那么,這個 type 實現起來也就非常簡單了

  1. import { 
  2.     GraphQLString, 
  3.     GraphQLObjectType, 
  4. from 'graphql'
  5.  
  6. const HelloWorldType = new GraphQLObjectType({ 
  7.     name'HelloWorldType'
  8.     fields: () => ({ 
  9.         hello: { 
  10.             type: GraphQLString, 
  11.         } 
  12.     }) 
  13. }); 

 

 簡單分析一下上面的代碼,可以看到 HelloWorldType 是一個 GraphQLObjectType 的實例,它包含一個 fields 是 hello,這個 hello 所對應的返回類型是字符串。

那如何返回 world 字符串?那就給它個 resolve 方法 

  1. const HelloWorldType = new GraphQLObjectType({ 
  2.     name'HelloWorldType'
  3.     fields: () => ({ 
  4.         hello: { 
  5.             type: GraphQLString, 
  6.             resolve() { 
  7.                 return 'world'
  8.             }, 
  9.         } 
  10.     }) 
  11. }); 

 這樣類型就定義好了,還記不記得上篇文章提到的類型定義完成后該怎么辦?

對,創建查詢的 schema。 

  1. import { 
  2.     GraphQLString, 
  3.     GraphQLObjectType, 
  4.     GraphQLSchema, 
  5. } from 'graphql'; 
  6.  
  7. const HelloWorldType = new GraphQLObjectType({ 
  8.     name: 'HelloWorldType', 
  9.     fields: { 
  10.         hello: { 
  11.             type: GraphQLString, 
  12.             resolve() { 
  13.                 return 'world'; 
  14.             }, 
  15.         } 
  16.     } 
  17. }); 
  18. const schema = new GraphQLSchema({ 
  19.     query: HelloWorldType 
  20. }); 

 schema 設置好了,是不是想查詢看看哪?

[[169552]]

 

東風當然是服務器啦。GraphQL 官方提供 express-graphql 這個中間件來支持基于 GraphQL 的查詢,所以,這里選用 Express 作為服務器。

安裝就不再重復了,只需將剛剛建立的 schema 添加到 express 的中間件中就可以了。 

  1. const app = express(); 
  2.  
  3. app 
  4.     .use('/graphql', graphqlHTTP({ schema, pretty: true })) 
  5.     .listen(3000, () => { 
  6.         console.log('GraphQL server running on http://localhost:3000/graphql'); 
  7.     }); 

 當當當當~完成,去 Postman 里查詢 http://localhost:3000/graphql?query={hello} 看看吧。

Blog System

在上一篇文章里,我們設計了一個博客的查詢 schema,這次我們就來動手實現它。(下面就開始講例子啦,不愿聽我嘮叨的可以直接看代碼)

前面 HelloWorld 的例子講的比較詳細,現在大家熟悉了語法,接下來的案例就會過得快一些。

首先是 PostType,這里對 Posttype 做了一點小修改,給幾個字段添加了不能為空的設計。 

  1. /** 
  2.  * type Post { 
  3.  *   id: ID!, 
  4.  *   name: String!, 
  5.  *   createDate: String!, 
  6.  *   title: String!, 
  7.  *   subtitle: String, 
  8.  *   content: String, 
  9.  *   tags: [Tag] 
  10.  * } 
  11.  */ 
  12. const Post = new GraphQLObjectType({ 
  13.     name'PostType'
  14.     fields: () => ({ 
  15.         id: { 
  16.             type: new GraphQLNonNull(GraphQLID) 
  17.         }, 
  18.         name: { 
  19.             type: new GraphQLNonNull(GraphQLString) 
  20.         }, 
  21.         createDate: { 
  22.             type: new GraphQLNonNull(GraphQLString) 
  23.         }, 
  24.         title: { 
  25.             type: new GraphQLNonNull(GraphQLString) 
  26.         }, 
  27.         subtitle: { 
  28.             type: GraphQLString 
  29.         }, 
  30.         content: { 
  31.             type: GraphQLString 
  32.         }, 
  33.         tags: { 
  34.             type: new GraphQLList(TagType), 
  35.             resolve: post => post.tags.map(tagName => getTagByName(tagName)) 
  36.         } 
  37.     }) 
  38. }); 

 然后是另一個主要的 type: Tag type。 

  1. /** 
  2.  * type Tag { 
  3.  *   id: ID!, 
  4.  *   name: String!, 
  5.  *   label: String!, 
  6.  *   createDate: String!, 
  7.  *   posts: [Post] 
  8.  * } 
  9.  */ 
  10. const Tag = new GraphQLObjectType({ 
  11.     name'TagType'
  12.     fields: () => ({ 
  13.         id: { 
  14.             type: new GraphQLNonNull(GraphQLID) 
  15.         }, 
  16.         name: { 
  17.             type: new GraphQLNonNull(GraphQLString) 
  18.         }, 
  19.         label: { 
  20.             type: new GraphQLNonNull(GraphQLString) 
  21.         }, 
  22.         createDate: { 
  23.             type: new GraphQLNonNull(GraphQLString) 
  24.         }, 
  25.         posts: { 
  26.             type: new GraphQLList(PostType), 
  27.             resolve: tag => getPostsList().filter(post => ~post.tags.indexOf(tag.name)) 
  28.         } 
  29.     }) 
  30. }); 

 兩個主要的類型已經定義好了,把它們倆整合起來就是博客類型了。 

  1. /** 
  2.  * type Blog { 
  3.  *   post: Post,    // 查詢一篇文章 
  4.  *   posts: [Post],    // 查詢一組文章,用于博客首頁 
  5.  *   tag: Tag,        // 查詢一個標簽 
  6.  *   tags: [Tag],    // 查詢所有標簽,用于博客標簽頁 
  7.  * } 
  8.  */ 
  9. const BlogType = new GraphQLObjectType({ 
  10.     name'BlogType'
  11.     fields: () => ({ 
  12.         post: { 
  13.             type: PostType, 
  14.             args: { 
  15.                 name: { 
  16.                     type: GraphQLString 
  17.                 } 
  18.             }, 
  19.             resolve: (blog, { name }) => getPostByName(name), 
  20.         }, 
  21.         posts: { 
  22.             type: new GraphQLList(PostType), 
  23.             resolve: () => getPostsList(), 
  24.         }, 
  25.         tag: { 
  26.             type: TagType, 
  27.             args: { 
  28.                 name: { 
  29.                     type: GraphQLString 
  30.                 } 
  31.             }, 
  32.             resolve: (blog, { name }) => getTagByName(name), 
  33.         }, 
  34.         tags: { 
  35.             type: new GraphQLList(TagType), 
  36.             resolve: () => getTagsList(), 
  37.         } 
  38.     }) 
  39. }); 

 

這里有一個新東西,就是 arg 字段,用來獲取查詢參數,如果在沒有設置過 arg 字段的屬性上添加變量進行查詢,graphql-js 的驗證系統會報錯。

***,將之前的 helloworld 類型稍微修飾一下,獨立出來,然后和 blog type 整合到一起成為根查詢類。 

  1. const queryType = new GraphQLObjectType({ 
  2.     name'RootQueryType'
  3.     fields: () => ({ 
  4.         hello: WorldType, 
  5.         blog: { 
  6.             type: BlogType, 
  7.             resolve: () => ({}) 
  8.         }, 
  9.     }) 
  10. }); 
  11.  
  12. const schema = new GraphQLSchema({ 
  13.     query: queryType 
  14. }); 

 OK。這樣整個 Demo 就完成了(查看源碼戳這里),快去 Postman 試試各種查詢,體驗 GraphQL 的神奇吧。(不知道怎么寫查詢語句的就看上一篇吧)

[[169553]]

 ***

如果,你不喜歡 GET 方法或查詢字符串過長,express-graphql 也支持 POST 方法,服務器會先查看請求的 URL 中是否包含查詢字符串,如果不包含就會去 request body 中獲取,只需在 request header 中將 Content-Type 設置為 application/graphql 就可以了。

全文一直在說查詢,或許你會疑惑,那我修改怎么做哪?graphql 中的修改稱之為 mutation。mutation 可以定義自己的接口解析類,它在 graphql 的 schema 中是一個可選項,其他的和查詢并無兩樣,只是***在 resolve 方法中的處理方式不同而已。 

  1. const schema = new GraphQLSchema({ 
  2.     query: queryType, 
  3.     mutation: mutationType 
  4. }); 

 ***的***提一句,nodemon 很好用,誰用誰知道。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2020-09-28 06:57:39

Node.jsGraphQLAPI

2020-06-24 07:00:00

GraphQL API監控

2020-04-07 13:40:13

GraphQLAPI編程語言

2017-08-18 12:15:35

大數據MySQLGraphQL

2021-04-23 09:09:19

GraphQLREST查詢

2019-12-09 08:00:00

GraphQLAPI架構

2022-12-05 07:13:44

2023-11-09 09:13:48

GraphQLAPI 架構

2024-04-16 12:00:14

API系統

2022-05-06 09:52:17

REST接口API

2024-06-24 00:20:00

API應用程序接口

2022-11-21 18:00:26

GraphQLAPI開發

2021-02-05 17:47:53

GraphQLAPI開發

2025-03-13 06:22:59

2023-06-26 13:08:52

GraphQL服務數據

2023-04-10 07:40:36

GraphQLRest通信模式

2021-04-21 09:04:43

開發SpringBoot框架

2020-10-27 18:45:45

GolangGraphQ開發

2021-12-15 09:00:00

GraphQL安全漏洞

2021-02-20 17:25:18

Netflix開源GraphQL
點贊
收藏

51CTO技術棧公眾號

97电影在线观看| 成人一二三区视频| 久久国产精品99久久久久久老狼 | 黑人巨大精品欧美一区免费视频 | 99精品国产高清一区二区| 麻豆影视在线观看_| 欧美高清在线一区| 三区精品视频| 久久在线视频| 久久成人亚洲精品| 日本高清在线观看视频| 性久久久久久久久| 日韩肉感妇bbwbbwbbw| 国内精品久久久久影院薰衣草| 91视频网页| 欧美重口另类| 久久久精品欧美| 国产综合色区在线观看| 91精品国产综合久久小美女| 老司机很黄的视频免费| 久久色.com| 国产精品一线二线三线| 久久99国产乱子伦精品免费| 精品免费日产一区一区三区免费| 日韩一区电影| 国产精品成人v| 美女网站色精品尤物极品姐弟| 日韩在线视频网站| 日本在线精品| 一区二区三区视频免费| sis001欧美| 亚洲欧洲高清在线| 欧美aa视频| 亚洲精品视频播放| 欧美办公室脚交xxxx| 日韩免费一区二区| 蜜乳av一区| 精品精品国产高清一毛片一天堂| a级网站在线播放| 精品欧美乱码久久久久久1区2区| а√天堂在线官网| 精品国产乱码久久久久久久| av香蕉成人| 精品少妇一区二区三区在线播放| 免费黄色网址在线观看| 91精品国产综合久久久蜜臀粉嫩 | 一级中文字幕一区二区| www.99re.av| 久久九九久久九九| 一区二区三区 日韩| 欧美经典三级视频一区二区三区| 日韩毛片在线免费看| 2023国产精品自拍| 天天爱天天做色综合| 一区二区三区欧美日| 无线免费在线视频| 制服丝袜av成人在线看| 成人在线黄色电影| 亚洲天堂2020| 老司机精品视频在线播放| 国产精品天天狠天天看| 好看不卡的中文字幕| 欧美一二三区| 国产一区二区免费看| 国产成人黄色片| 国产精品你懂的在线| 男人午夜天堂| 4438成人网| 成人做爰视频www| 欧美一区二区三区四区在线| 91久久夜色精品国产按摩| 久久国产一区| 成人aa视频在线观看| 好紧好硬好湿我太爽了| 精品视频一区三区九区| 美女福利一区二区| 国产91久久婷婷一区二区| 亚洲每日更新| 91视频最新入口| 日韩欧美在线中文字幕| 松下纱荣子在线观看| 2019av中文字幕| 国产精品入口66mio| a在线视频观看| 精品国产91久久久久久老师| 免费在线国产视频| 国内精品久久久久久中文字幕| 伊人久久成人| 欧美成人xxxxx| 欧美性videosxxxxx| 日韩国产91| av一区和二区| 久久久夜色精品亚洲| 韩国三级在线观看久| 尤物九九久久国产精品的特点| 欧美日韩在线二区| 亚洲美女自拍偷拍| 午夜欧美视频在线观看| 亚洲一区二区三区四区| 成人激情视频小说免费下载| 国产福利91精品| 亚洲色图图片网| 久久夜精品香蕉| 久久久久国产精品午夜一区| 色乱码一区二区三区在线| 日韩欧美国产精品| 北条麻妃国产九九九精品小说| 日本久久高清视频| 在线亚洲一区二区| 国产精品网在线观看| 一本一道久久a久久精品综合| 亚洲综合图片区| 国产一区2区在线观看| 欧美一区二区三区在线播放| 国产精品国产三级国产aⅴ无密码| 午夜伦理在线视频| 国产精品高潮视频| 91在线视频网址| 在线视频中文字幕第一页| 国产精品视频一区国模私拍| 91色综合久久久久婷婷| 欧美videos另类精品| 成人免费在线一区二区三区| 亚洲色图一区二区| 欧美第一在线视频| 性高湖久久久久久久久aaaaa| 91精品在线观看入口| 伊人色**天天综合婷婷| 国产三级视频| 麻豆一区二区在线观看| 国产一区二区在线观看免费| 3d成人动漫在线| 91精品国产综合久久香蕉922| 欧美国产一区二区| 四虎影视成人精品国库在线观看| 视频一区二区三区免费观看| 富二代精品短视频| 免费av一区二区三区四区| 国产自偷自偷免费一区 | 在线欧美一区| 最新中文字幕在线视频| 国内精品一区二区三区| 不卡一区在线观看| 日韩欧美一区二区三区在线观看 | 欧美大陆国产| 中文字幕超清在线免费观看| 欧美日产国产精品| 9999国产精品| 日本高清好狼色视频| 久久91精品国产91久久久| 成人精品视频.| 日本另类视频| 国产精品igao激情视频| 精品国产91乱码一区二区三区 | 噜噜噜躁狠狠躁狠狠精品视频| 色视频在线观看福利| 日韩av电影中文字幕| 樱花草国产18久久久久| 欧美三级午夜理伦三级小说| 拍拍拍999自拍偷| **欧美日韩vr在线| 亚洲视频小说图片| 亚洲天堂日韩在线| 中午字幕在线观看| 91手机在线播放| 欧美日本韩国一区| 久久国产成人| 新版的欧美在线视频| 日韩中文在线字幕| 北条麻妃99精品青青久久| 久久理论电影网| 欧美交a欧美精品喷水| 免费观影入口看日本视频| 国产成人精品网站| 欧美日韩一区免费| 欧美专区一区二区三区| 最新中文字幕在线播放| 三上悠亚久久精品| 91成人在线视频| 色综合天天综合网天天狠天天| 在线视频精品| 成人日韩在线| 成年人羞羞的网站| 国产精品二区三区四区| 亚洲国产精品va在线看黑人| 99麻豆久久久国产精品免费| 天堂成人娱乐在线视频免费播放网站 | 一二三四区在线观看| 最新欧美日韩亚洲| 欧美成年人网站| 亚洲成av人**亚洲成av**| 久热在线观看视频| 久久a爱视频| 精品freesex老太交| 国产91精品久久久久久久| 性做久久久久久免费观看| 亚洲国产片色| 最新日韩一区| 国产91久久久久蜜臀青青天草二| 久久久久久99|