Bitcoin价格行情GraphQL API封装实战【Node.js】

简介:

在这篇文章中,我们将学习如何使用Node.js开发一个比特币实时价格行情的GraphQL API。

比特币开发相关链接:

1、创建项目目录

在终端中执行如下命令创建一个新目录并进入该目录:

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

2、初始化项目

在终端中执行yarn init初始化项目目录,得到的package.json类似以下内容:

{
  "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中添加如下内容:

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

最终的package.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目录,得到如下的目录结构:

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

在graph目录中创建3个js文件:types.js、resolver.js和request.js,最终得到如下的目录结构:

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

3、安装依赖包

在这个项目中,我们将需要axios和graphql-yoga,因此在项目根目录
执行如下命令:

yarn add axios graphql-yoga

好了,可以开始写代码了。

4、类型定义

在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

5、查询

GraphQL是关于数据管理的,查询基本上就是请求对象的指定字段。
例如:

query {
  getPrices {
    price
  }
}

得到如下结果:

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

可以看到,查询结果和请求有相同的结构。

6、查询与修改

在一个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用来选择要查询的币种。

7、请求辅助工具

在我们继续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请求,当然你也可以换成其他你熟悉的工具。

8、解析器

每个类型的每个字段背后都对应一个解析器函数,该函数应当由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:字段特定信息

9、服务器

现在我们已经有了类型、解析器和辅助工具,要做的就是整合起来。

打开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 — 汇智网

目录
相关文章
|
18天前
|
缓存 安全 API
RESTful与GraphQL:电商API接口设计的技术细节与适用场景
本文对比了RESTful与GraphQL这两种主流电商API接口设计方案。RESTful通过资源与HTTP方法定义操作,简单直观但可能引发过度或欠获取数据问题;GraphQL允许客户端精确指定所需字段,提高灵活性和传输效率,但面临深度查询攻击等安全挑战。从性能、灵活性、安全性及适用场景多维度分析,RESTful适合资源导向场景,GraphQL则适用于复杂数据需求。实际开发中需根据业务特点选择合适方案,或结合两者优势,以优化用户体验与系统性能。
|
2月前
|
人工智能 自然语言处理 JavaScript
通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
通义灵码基于自然语言需求,快速生成完整Vue组件。例如,用Vue 2和JavaScript实现贪吃蛇游戏:包含键盘控制、得分系统、游戏结束判定与Canvas动态渲染。AI生成的代码符合规范,支持响应式数据与事件监听,还能进阶优化(如增加启停按钮、速度随分数提升)。传统需1小时的工作量,使用通义灵码仅10分钟完成,大幅提升开发效率。操作简单:安装插件、输入需求、运行项目即可实现功能。
146 4
 通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
|
6月前
|
存储 安全 API
Next.js 实战 (九):使用 next-auth 完成第三方身份登录验证
这篇文章介绍了next-auth,一个为Next.js设计的身份验证库,支持多种认证方式,如电子邮件和密码、OAuth2.0提供商(如Google、GitHub、Facebook等)以及自定义提供商。文章包含了如何配置Github Provider以及会话管理,并提到了适配器Adapters在next-auth中的作用。最后,文章强调了next-auth的强大功能值得进一步探索。
353 10
|
3月前
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
4月前
|
监控 JavaScript 前端开发
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
|
4月前
|
XML 网络协议 API
从cURL到GraphQL:不同API类型概述
本文概述了不同API类型及其应用,帮助开发人员选择合适的工具。cURL是强大的命令行工具,适用于调试和自动化;RESTful API基于HTTP方法,适合Web服务和微服务架构;SOAP用于企业级应用,提供高安全性;GraphQL通过精确查询减少数据传输;WebSocket支持实时通信,适用于低延迟场景。了解这些API的特点和优势,有助于构建高效、可扩展的应用程序。
|
6月前
|
设计模式 数据安全/隐私保护
Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式
这篇文章介绍了在Next.js框架下,如何处理中后台管理系统中特殊页面(如登录页)不包裹根布局(RootLayout)的问题。作者指出Next.js的设计理念是通过布局的嵌套来创建复杂的页面结构,这虽然保持了代码的整洁和可维护性,但对于特殊页面来说,却造成了不必要的布局包裹。文章提出了一个解决方案,即通过判断页面的skipGlobalLayout属性来决定是否包含RootLayout,从而实现特殊页面不包裹根布局的目标。
230 33
|
6月前
|
JavaScript 前端开发 安全
盘点原生JS中目前最没用的几个功能API
在JavaScript的发展历程中,许多功能与API曾风光无限,但随着技术进步和语言演化,部分功能逐渐被淘汰或被更高效的替代方案取代。例如,`with`语句使代码作用域复杂、可读性差;`void`操作符功能冗余且影响可读性;`eval`函数存在严重安全风险和性能问题;`unescape`和`escape`函数已被`decodeURIComponent`和`encodeURIComponent`取代;`arguments`对象则被ES6的剩余参数语法替代。这些变化体现了JavaScript不断优化的趋势,开发者应紧跟技术步伐,学习新技能,适应新技术环境。
84 10
|
6月前
|
中间件 API
Next.js 实战 (八):使用 Lodash 打包构建产生的“坑”?
这篇文章介绍了作者在使用Nextjs15进行项目开发时遇到的部署问题。在部署过程中,作者遇到了打包构建时的一系列报错,报错内容涉及动态代码评估在Edge运行时不被允许等问题。经过一天的尝试和调整,作者最终删除了lodash-es库,并将radash的部分源码复制到本地,解决了打包报错的问题。文章最后提供了项目的线上预览地址,并欢迎读者留言讨论更好的解决方案。
171 10
|
7月前
|
前端开发 API 开发者
Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
这篇文章介绍了Framer Motion,一个为React设计的动画库,提供了声明式API处理动画和页面转换,适合创建响应式用户界面。文章包括首屏加载动画、路由加载Loading、路由进场和退场动画等主题,并提供了使用Framer Motion和next.js实现这些动画的示例代码。最后,文章总结了这些效果,并邀请读者探讨更好的实现方案。
193 7