GraphQL基礎實踐

cover.png

基礎篇

理論知識

graphQL介紹

GraphQL 既是一種用於 API 的查詢語言也是一個知足你數據查詢的運行時。它由Facebook開發和開源,強烈地表達了代碼即文檔的指望。可以精確有效地獲得數據,沒有冗餘。前端

若是你想了解API設計的相關文章,那麼我建議你去了解下SOAP協議,而後是Restful API協議,在業務不是很複雜的狀況下,正常的Restful API的設計已經夠用了,咱們的graphQL的出現就是克Restful API的一些侷限性的,遺憾的是,在企業中你想推翻一種技術去使用一種新的技術阻力仍是蠻大的,任重而道遠,因此在國內若是想去實踐一番,要去那種「很新的公司」,從新設計技術架構方案。做爲一個技術人,咱們能作的是,熱愛它,至於它好仍是很差,留給時間去證實吧!node

who-to-use.png

graphQL的優勢

  • 可定製程度化高

    所見即所得,各類不一樣的前端框架平臺能夠指定本身須要的字段。查詢的返回結果就是輸入的查詢結構的精確映射git

  • 靈活的API聚合

    必定條件下,只須要一次網絡請求,就能得到資源和子資源的數據。mongodb

  • 代碼即文檔

    GraphQL 會把schema 定義和相關的註釋生成可視化的文檔。數據庫

  • 參數類型強校驗

    GraphQL 提供了強類型的schema 機制,從而自然確保了參數類型的合法性。express

graphQL類型系統

  • 標量類型
    • Int
    • Float
    • String
    • Boolen
    • ID
  • 其餘高級數據類型
    • Object
    • Interface
    • Union
    • Enum
    • Input Object
    • List
    • Non-Null

graphQL查詢語言

  • query:只讀請求
  • mutation:讀寫請求
  • subscription : 實時訂閱(新版本支持)

實踐篇

介紹完樓上的理論部分,咱們來進行實踐感覺一下吧

實踐一:一個基於Express的一言API的例子

第一步:建立項目

g1.png

咱們先在工做目錄建立一個項目文件夾叫graphql-express,以後咱們進入到這個項目,隨後咱們建立一個基於npm管理的項目,而後安裝相應的包庫。npm

第二步:建立app.js文件並導入相應包庫

g2.png

由於這個是基於express的,因此咱們引入express後建立了一個express實例,而後引入了兩個中間件,後面用的。json

第三步:建立一個testSchema

g3.png

咱們建立一個Schema叫testSchema,而後寫個低配版的一言的例子,而後建立一個查詢方法,返回咱們建立的一言對象類型。瀏覽器

第四步:指定一個根

g4.png

這個就是咱們的測試用例數據啦,後面會在瀏覽器中顯示。前端框架

第五步:建立一箇中間件

g5.png

而後咱們寫個中間件,把相應的屬性掛載上去。

第六步: 監聽端口

g6.png

最後,不要忘了監聽端口哦。

好的,至此咱們已完成一個簡單的基於graphQL的例子,而後運行node app.js ,咱們打開瀏覽器訪問:http://localhost:3000/graphql來看一下吧。

g7.gif

能夠看到咱們樓上說的代碼即文檔,而後返回的數據也很靈活,你但願有什麼,它就給你什麼對吧。

實踐二: 結合Mongodb改造一言API的例子

下面咱們結合Mongodb數據庫來作下

這裏我就不向上面介紹的那麼詳細了,抓重點的分析一些吧。

g8.png

其中,config文件夾下是一些數據配置文件,而後dist文件夾是基於git進行版本控制輸出的tag,對,這裏可能用tag更應景一點。node_modules就是node安裝的模塊,而後schema下面就是樓上的定義模型,utils包下是一些通用工具類,這裏看名字也該知道是封裝好的基於mongodb的庫,app.js就是入口文件啦,.gitignore文件就是把一些不要進行版本控制的文件給排除,這裏就是node_modules不高興放上去,package.json以及帶lock的那位就是基於npm的包管理配置文件,README.md就是寫的說明文檔啦,介紹完畢。

咱們這裏着重看schema下面的hitokotSchema文件吧。

g9.png

這裏咱們引入封裝的DB工具模塊,而後引入相應的graphql模塊類型,而後咱們仍是和樓上同樣建立一個一言的Schema,惟一不一樣的是咱們不是用buildSchema,而後定義一個根,這裏根樓上不同的是,它這邊會有多條數據因此放到GraphQLList裏面,異步的話Promise,fun*,async你隨便吧,我這裏選擇async,最後給它輸出出去。

以後要作的事情就是跟樓上同樣了,在app.js中寫個中間件,能夠參考樓上。

咱們仍是打開瀏覽器測試一下吧。

g10.gif

參考文獻

graphQL中文文檔: https://graphql.cn

相關文章
相關標籤/搜索