浅谈NodeJS搭建GraphQL API服务

简介: GraphQL是一种通过强类型查询语言构建api的新方法。GraphQL于2015年由Facebook发布,目前正迅速获得关注,并被Twitter和Github等其他大型公司所采用。GraphQL API设计理念是有别于REST API,简单了解可以看看这篇文章《GraphQL与REST:两种API架构》

image.pngGraphQL是一种通过强类型查询语言构建api的新方法。GraphQL于2015年由Facebook发布,目前正迅速获得关注,并被Twitter和Github等其他大型公司所采用。GraphQL API设计理念是有别于REST API,简单了解可以看看这篇文章《GraphQL与REST:两种API架构

在本文中,将带大家使用NodeJs 搭建一个简单的GraphQL API服务

  • WEB服务:node
  • 数据库:postgres
  • 数据查询:
  • express
  • apolo-server-express
  • Sequelize ORM
  • graphql schema language
  • graphql-sequelize

GraphQL是什么?

image.png

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。

简单的说,它是API的可查询模式,允许客户只请求他们需要的数据,并提供了一个标准化的系统来设计API,而不需要参考文档。

GraphQL 已有多种编程语言支持。下表包含一些流行的服务端框架、客户端库、服务和其他有用的内容。

服务端库除了 GraphQL JavaScript 参考实现,还有其他服务端库:

  • C# / .NET
  • Clojure
  • Elixir
  • Erlang
  • Go
  • Groovy
  • Java
  • JavaScript
  • PHP
  • Python
  • Scala
  • Ruby

介绍:graphql.cn/

为什么选择GraphQL

之所以选择GraphQL,是因为前端很多项目获取数据需要通过多个API组装才能获取到所需要的数据,设计API的时候经常会考虑多应用场景,导致单个场景下调用会获得多余的数据。

出于这个考虑,看到GraphiQL介绍,能够为数据声明一个模式并让客户端根据需要查询所需要的数据的想法所吸引。喜欢通过网络传输最小数量的请求,将请求自由组合在一起以获得最佳的有效负载,并在客户端和服务器上进行缓存。

GraphQL 带来的最大好处是精简请求响应内容,不会出现冗余字段,前端可以决定后端返回什么数据。当然,前端的决定权取决于后端支持什么数据,因此 GraphQL 更像是精简了返回值的 REST,而后端接口也可以一次性定义完所有功能,而不需要逐个开发。

GraphQL API 的主要应用场景是 API 网关,在客户端和服务之间提供了一个抽象层。

image.png

Node服务

选择node作为服务器端语言,因为它拥有围绕GraphQL的非常强大的社区支持,并且高度可移植。

在新版本中支持 async / wait,同步模型更容易管理,这在构建高度异步的API时是一个巨大的优势。

ORM到GraphQL适配

graphql-sequelize,将序列化模型映射到GraphQL类型、查询和更新的代码。它提供了两个优秀的抽象:

  • 用于将GraphQL查询映射到Sequelize操作的解析器
  • 将模型定义作为GraphQL类型字段列表重用的attributeFields映射。

GraphQL schema

接下来创建查询类型,如下:

// 定义查询数据类型
const managerType = new GraphQLObjectType({
    name: "manager",
    description: "A manager",
    fields: {
        id: {
            type: new GraphQLNonNull(GraphQLInt),
            description: "The id of the manager."
        },
        username: {
            type: GraphQLString,
            description: "The username of the manager."
        },
        password: {
            type: GraphQLString,
            description: "The password of the manager."
        },
        email: {
            type: GraphQLString,
            description: "The email of the manager."
        }
    }
});
// 定义查询接口
const schema = new GraphQLSchema({
    query: new GraphQLObjectType({
        name: "root",
        fields: {
            managers: {
                type: new GraphQLList(managerType),
                resolve: resolver(manager)
            },
            manager: {
                type: new GraphQLList(managerType),
                args: {
                    username: {
                        description: "username of the manager",
                        type: new GraphQLNonNull(GraphQLString)
                    }
                },
                resolve: resolver(manager)
            }
        }
    })
});

Web服务器框架

选择express作为基本的web服务器框架,是因为它在节点生态系统、插件支持和简单API中无处不在。

express允许监听端口并响应HTTP请求,但是需要另一层来接收和响应GraphQL请求。

apollo-server-express,它有一个非常简单的API,并进行了一些映射,以允许节点GraphQL模式语言中定义模式。如下:

const express = require("express");
const { ApolloServer } = require("apollo-server-express");
const schema = require("./schema");
const server = new ApolloServer({ schema });
const app = express();
server.applyMiddleware({ app });
app.listen({ port: 3009 }, () => console.log(`🚀 Server ready at http://localhost:3009${server.graphqlPath}`));

调试及文档

浏览器打开:http://localhost:3009/graphql,GraphiQL可以很容易地让人感受到”代码即文档”的快乐。

image.png

自动生成接口文档

image.png

  • 查询列表数据:
    { managers { username email } }

image.png

  • 按条件查询:
    { manager(username:"QuintionTang") { username email } }

image.png

AJAX方式调用:

const { createApolloFetch } = require("apollo-fetch");
const fetch = createApolloFetch({
    uri: "http://localhost:3009/graphql"
});
fetch({
    query: "{ managers { username }}"
}).then(res => {
    console.log(res.data);
});
fetch({
    query: `{
        manager(username: "QuintionTang") {
        email
        id
      }
    }`
}).then(res => {
    console.log(res.data);
});

客户端实现

客户端常见的框架有 RelayApollo Client

  • Relay 是由 Facebook 官方提供的解决方案
    使用 Relay 的好处是,许多 GraphQL 的服务端框架都会支持 Relay 的标准(比如数据的分页接口)。
  • Apollo 是在 GraphQL 方面热度超高的社区
    apollo-client的实现在诸多方面宣称自己兼容 Relay 的风格,所以使用起来应该也是大同小异。

总结

本文只是一个简单的实现,个人感觉概念很吸引,在复杂的项目中能否达到预期就需要在实践过程中去体验。


相关文章
|
30天前
|
API 数据库 数据安全/隐私保护
利用Django框架构建高效后端API服务
本文将介绍如何利用Django框架构建高效的后端API服务。通过深入分析Django框架的特性和优势,结合实际案例,探讨了如何利用Django提供的强大功能来构建高性能、可扩展的后端服务。同时,还对Django框架在后端开发中的一些常见问题进行了解决方案的探讨,并提出了一些建设性的建议。
51 3
|
1月前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
解释如何在 Python 中实现 Web 服务(RESTful API)。
26 0
|
1月前
|
监控 网络协议 API
阿里云BssOpenAPI是一个基于阿里云开放API的服务
【2月更文挑战第24天】阿里云BssOpenAPI是一个基于阿里云开放API的服务
138 6
|
1月前
|
弹性计算 负载均衡 网络协议
这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
【2月更文挑战第20天】这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
72 1
|
2月前
|
缓存 安全 API
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
公司对外开放的OpenAPI-Server服务,作为核心内部系统与外部系统之间的重要通讯枢纽,每天处理数百万次的API调用、亿级别的消息推送以及TB/PB级别的数据同步。经过多年流量的持续增长,该服务体系依然稳固可靠,展现出强大的负载能力。
55 9
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
|
2月前
|
Web App开发 JavaScript NoSQL
深入浅出:构建基于Node.js的RESTful API
在当今快速发展的互联网时代,RESTful API已成为前后端分离架构中不可或缺的一部分。本文旨在为初学者和中级开发人员提供一个清晰、简洁的指南,详细介绍如何使用Node.js构建一个高效、可维护的RESTful API。通过结合实际案例,本文将从API设计理念出发,深入讲解如何利用Express框架及MongoDB数据库实现API的增删改查功能,同时探讨如何通过JWT进行安全认证,确保数据传输的安全性。此外,文章还将简要介绍如何使用Swagger生成API文档,使得API的测试和维护更加便捷。无论你是希望提升现有项目的API设计,还是想从零开始构建一个新项目,本文都将为你提供一条清晰的道路
|
2月前
|
安全 前端开发 API
深入理解与实践GraphQL:构建高效、灵活的API
在本文中,我们将探索GraphQL这一强大的API查询语言及其运行原理。不同于传统的RESTful API设计,GraphQL提供了一种更加高效、灵活的方式来交互数据。通过实例和比较,本文旨在揭示GraphQL如何使前端和后端开发更加紧密协作,同时减少数据传输的冗余。我们将从GraphQL的基本概念入手,深入到查询(Queries)、变更(Mutations)和订阅(Subscriptions)的实现,最后探讨如何在实际项目中部署和优化GraphQL服务。此外,本文还将简要介绍如何利用现有的GraphQL工具和库来加速开发过程。
|
21天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
27天前
|
安全 API 开发者
构建高效可扩展的RESTful API服务
在数字化转型的浪潮中,构建一个高效、可扩展且易于维护的后端API服务是企业竞争力的关键。本文将深入探讨如何利用现代后端技术栈实现RESTful API服务的优化,包括代码结构设计、性能调优、安全性强化以及微服务架构的应用。我们将通过实践案例分析,揭示后端开发的最佳实践,帮助开发者提升系统的响应速度和处理能力,同时确保服务的高可用性和安全。
27 3
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务