GraphQL實戰比特幣實時行情【NodeJS】

在這篇文章中,咱們將學習如何使用Node.js開發一個比特幣實時價格行情的GraphQL API。php

比特幣開發相關連接:java

一、建立項目目錄

在終端中執行以下命令建立一個新目錄並進入該目錄:node

mkdir btc-gql-api && cd btc-gql-api

二、初始化項目

在終端中執行yarn init初始化項目目錄,獲得的package.json相似如下內容:ios

{
  "name": "my-new-project",
  "version": "1.0.0",
  "description": "My New Project description.",
  "main": "index.js",
  "repository": {
    "url": "https://example.com/your-username/my-new-project",
    "type": "git"
  },
  "author": "Your Name <you@example.com>",
  "license": "MIT"
}

在終端執行touch index.js建立一個空的js文件,而後在package.json中添加以下內容:git

...
"scripts": {
  "start": "node index.js"
},
...

最終的package.json文件看起來相似以下內容:json

{
  "name": "my-new-project",
  "version": "1.0.0",
  "description": "My New Project description.",
  "main": "index.js","scripts": {
    "start": "node index.js"
  },
  "repository": {
    "url": "https://example.com/your-username/my-new-project",
    "type": "git"
  },
  "author": "Your Name <you@example.com>",
  "license": "MIT"
}

在項目目錄中建立一個graph目錄,獲得以下的目錄結構:axios

+ btc-gql-api
|__ graphql
|__ package.json
|__ index.json

在graph目錄中建立3個js文件:types.js、resolver.js和request.js,最終獲得以下的目錄結構:c#

+ btc-gql-api
|__+graphql
|____request.js
|____resolvers.js
|____types.js
|__ package.json
|__ index.json

三、安裝依賴包

在這個項目中,咱們將須要axios和graphql-yoga,所以在項目根目錄 執行以下命令:api

yarn add axios graphql-yoga

好了,能夠開始寫代碼了。瀏覽器

四、類型定義

在GraphQL Schema中最基礎的組件就是對象類型,它標識你能夠從服務中提取的對象類型,以及其中包含哪些字段。例如:

type User {
  name: String!
  email: String!
}

GraphQL有一些內置的基礎類型:

  • Int:32位有符號整數
  • Float:雙精度有符號浮點數
  • String:UTF-8字符序列
  • Boolean:布爾型,true或false
  • ID:惟一標識符,一般用於做爲對象的鍵

更詳細的文檔能夠參考graphql schema

如今讓咱們定義類型。打開./graphql/types.js文件,輸入以下內容:

const typeDefs = `
scalar JSON

type Price {
  price:JSON!
}`;

module.exports = typeDefs;

在上面的代碼中,咱們定義了一個類型Price,它只有一個非空字段price,字段類型爲JSON:

type Price {
  price:JSON!
}

JSON並非graphql的內置類型,是咱們自定義的:

scalar JSON

五、查詢

GraphQL是關於數據管理的,查詢基本上就是請求對象的指定字段。 例如:

query {
  getPrices {
    price
  }
}

獲得以下結果:

{
  "data": {
    "getPrices": {
      "price": {
        "USD": {
          "15m": 10436.54,
          "last": 10436.54,
          "buy": 10436.54,
          "sell": 10436.54,
          "symbol": "$"
        }
        ...
      }
    }
  }
}

能夠看到,查詢結果和請求有相同的結構。

六、查詢與修改

在一個schema內有兩種類型:查詢(query)與修改(mutation)。

每一個GraphQL服務至少有一個查詢類型,可能有一個修改類型。這些類型和常規的對象類型同樣,可是它們定義了每一個GraphQL查詢的入口點。看起來像這樣:

scalar JSON

type Price {
  price:JSON!
}

type Query {
  getPrices: Price!
  getPrice(currency:String!): Price!
}

上面代碼的意思是,咱們的GraphQL服務有一個Query類型,其中包含 getPrices和getPrice字段,其類型都是Price。咱們也能夠看到字段 getPrice有參數(currency:String!)。在GraphQL對象類型中的每一個 字段均可以有0或多個參數。

參數能夠是必需的或可選的,在上面的例子中,咱們要求一個必需的 參數currency用來選擇要查詢的幣種。

七、請求輔助工具

在咱們繼續GraphQL以前,咱們須要一個輔助工具來獲取比特幣實時價格。爲此咱們將使用blockchain.com的API,可是你能夠換成任何你喜歡的服務。

打開./graphql/request.js文件,輸入如下內容:

const axios = require("axios");module.exports = {
  getPrices: async () => {
    const url = "https://blockchain.info/ticker";
    try {
      return await axios.get(url);
    } catch (error) {
      console.error(error);
    }
  }
};

上面的代碼使用axios來構造GET請求,固然你也能夠換成其餘你熟悉的工具。

八、解析器

每一個類型的每一個字段背後都對應一個解析器函數,該函數應當由GraphQL服務端開發者提供。當一個字段執行時,對應的解析器就被調用並生成結果。

若是一個字段生成一個標量值例如字符串或數字,那麼執行就結束了。然而,若是一個字段生成一個對象值,那麼查詢將包含另外的字段,這將繼續解析直到最終獲得的字段都是標量值。

每一個GraphQL服務的頂層是全部可能的入口類型,一般被稱爲根(Root)類型或查詢(Query)類型。

打開文件./graphql/resolvers.js,輸入如下內容:

const requests = require("./requests");
const resolvers = {
  Query: {
    // Get all available prices
    async getPrices(parent, args, ctx, info) {
      const prices = await requests.getPrices();
      return { price: prices.data };
    },
    // Get the price of a given currency symbol
    async getPrice(parent, args, ctx, info) {
      const prices = await requests.getPrices();
      return { price: { [args["currency"]]: prices.data[args["currency"]] } };
    }
  }
};
module.exports = resolvers;

讓咱們分解說明下以上代碼。

首先引入咱們查詢比特幣實時行情的輔助工具:

const request = require("./request");

而後定義解析器:

const resolvers = {
  Query: {
    // Get all available prices
    async getPrices(parent, args, ctx, info) {
      const prices = await requests.getPrices();
      return { price: prices.data };
    },
    // Get the price of a given currency symbol
    async getPrice(parent, args, ctx, info) {
      const prices = await requests.getPrices();
      return { price: { [args["currency"]]: prices.data[args["currency"]] } };
    }
  }
};

咱們的解析器有一個根字段Query,在該對象內咱們將定義GraphQL Schema中的全部解析器。注意這些解析器的命名與types.js中一致。

每一個解析器都是一個函數,有4個參數:

  • parent:父對象
  • args:參數
  • ctx:上下文
  • info:字段特定信息

九、服務器

如今咱們已經有了類型、解析器和輔助工具,要作的就是整合起來。

打開index.js文件,輸入如下內容:

const { GraphQLServer } = require("graphql-yoga");
const typeDefs = require("./graphql/types.js");
const resolvers = require("./graphql/resolvers.js");
const server = new GraphQLServer({
  typeDefs,
  resolvers,
  context: {
    //if we pass anything here can be available in all resolvers
  }
});
server.start(() => console.log("Server is running on localhost:4000☄"));

首先咱們建立GraphQLServer實例:

...
const server = new GraphQLServer({
  typeDefs,
  resolvers,
  context: {
    //if we pass anything here can be available in all resolvers
  }
});
...

而後運行該實例:

server.start(() => console.log("Server is running on localhost:4000☄"));

運行後能夠看到以下輸出:

Server is running on localhost:4000☄

如今打開瀏覽器訪問http://localhost:4000,測試以下查詢:

query($currency:String!){
  getPrice(currency:$currency){
    price
  }
}
# Variables:
{
  "currency": "USD"
}

獲得以下結果:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FUdB6giq-1582590529946)(bitcoin-graphql-api/query-result.png)]

很是好!


原文連接:用Node.jS開發比特幣行情GraphQL API — 匯智網

相關文章
相關標籤/搜索