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

总结

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


相关文章
|
2月前
|
设计模式 开发框架 安全
C# 一分钟浅谈:GraphQL API 与 C#
本文介绍了 GraphQL API 的基本概念及其优势,并通过 C# 实现了一个简单的 GraphQL 服务。GraphQL 是一种高效的 API 查询语言,允许客户端精确请求所需数据,减少不必要的数据传输。文章详细讲解了如何使用 `GraphQL.NET` 库在 C# 中创建和配置 GraphQL 服务,并提供了常见问题的解决方案和代码示例。
69 4
|
2月前
|
JSON 缓存 JavaScript
深入浅出:使用Node.js构建RESTful API
在这个数字时代,API已成为软件开发的基石之一。本文旨在引导初学者通过Node.js和Express框架快速搭建一个功能完备的RESTful API。我们将从零开始,逐步深入,不仅涉及代码编写,还包括设计原则、最佳实践及调试技巧。无论你是初探后端开发,还是希望扩展你的技术栈,这篇文章都将是你的理想指南。
|
1月前
|
JSON JavaScript 前端开发
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将引导您步入Node.js的奇妙世界,通过实践操作,掌握如何使用这一强大的JavaScript运行时环境构建高效、可扩展的RESTful API。我们将一同探索Express框架的使用,学习如何设计API端点,处理数据请求,并实现身份验证机制,最终部署我们的成果到云服务器上。无论您是初学者还是有一定基础的开发者,这篇文章都将为您打开一扇通往后端开发深层知识的大门。
52 12
|
2月前
|
JavaScript NoSQL API
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发如同一座灯塔,指引着数据的海洋。本文将带你航行在Node.js的海域,探索如何从一张白纸到完成一个功能完备的RESTful API。我们将一起学习如何搭建开发环境、设计API结构、处理数据请求与响应,以及实现数据库交互。准备好了吗?启航吧!
|
2月前
|
JSON 关系型数据库 测试技术
使用Python和Flask构建RESTful API服务
使用Python和Flask构建RESTful API服务
103 2
|
2月前
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
2月前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
70 4
|
2月前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
2月前
|
前端开发 JavaScript API
探索GraphQL:如何构建高效的数据API
【10月更文挑战第25天】在现代Web开发中,API的效率和灵活性至关重要。本文探讨了如何利用GraphQL构建高效的数据API。GraphQL通过声明式查询方式,允许客户端精确指定所需数据,减少数据传输量,提高API效率。文章介绍了设置GraphQL服务器、设计API Schema、实现解析函数及调整前后端交互的具体步骤,展示了GraphQL的优势和应用场景。
52 2
|
2月前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API