浅谈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 的风格,所以使用起来应该也是大同小异。

总结

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


相关文章
|
3天前
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
14天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
35 4
|
17天前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
17天前
|
前端开发 JavaScript API
探索GraphQL:如何构建高效的数据API
【10月更文挑战第25天】在现代Web开发中,API的效率和灵活性至关重要。本文探讨了如何利用GraphQL构建高效的数据API。GraphQL通过声明式查询方式,允许客户端精确指定所需数据,减少数据传输量,提高API效率。文章介绍了设置GraphQL服务器、设计API Schema、实现解析函数及调整前后端交互的具体步骤,展示了GraphQL的优势和应用场景。
31 2
|
7天前
|
JavaScript 前端开发 NoSQL
深入浅出:使用Node.js构建RESTful API
【10月更文挑战第35天】在数字时代的浪潮中,后端技术如同海洋中稳固的灯塔,为前端应用提供数据和逻辑支撑。本文旨在通过浅显易懂的方式,带领读者了解如何利用Node.js这一强大的后端平台,搭建一个高效、可靠的RESTful API。我们将从基础概念入手,逐步深入到代码实践,最终实现一个简单的API示例。这不仅是对技术的探索,也是对知识传递方式的一次创新尝试。让我们一起启航,探索Node.js的奥秘,解锁后端开发的无限可能。
|
1月前
|
缓存 监控 前端开发
利用GraphQL提升API开发效率
【10月更文挑战第10天】本文介绍了GraphQL的核心概念、优势及其实现步骤,探讨了其在现代开发中的应用,包括动态数据需求、单页应用和微服务架构。通过缓存策略、批处理、安全性和监控等实战技巧,提升API开发效率和用户体验。
|
1月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
90 9
|
1月前
|
JSON JavaScript 前端开发
使用 Node.js 和 Express 构建 RESTful API 服务器
【10月更文挑战第3天】使用 Node.js 和 Express 构建 RESTful API 服务器
|
1月前
|
安全 API 数据库
掌握GraphQL:现代API开发的新选择
【10月更文挑战第1天】在传统RESTful API显现出局限性后,GraphQL作为新型API查询语言和运行时,提供更灵活的数据获取方式。客户端可精确指定所需数据结构,减少传输量并提升效率。本文探讨GraphQL核心概念、优势及实施方法。尽管存在复杂性和性能优化等挑战,GraphQL仍是构建现代API的强大工具。
|
30天前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API服务器
【10月更文挑战第12天】使用JavaScript和Node.js构建简单的RESTful API服务器
17 0