Fastify 和 GraphQL 的整合及其优点

前言

Fastify 是一个性能卓越的 Node.js Web框架,它是目前市面上最快的框架之一。GraphQL则是一种用于API开发的查询语言和运行时环境。由于其优美的数据查询和类型系统,它现在已经成为了前端领域的一种新型选择。

今天我们将会探讨如何将 Fastify 和 GraphQL 整合到一起,以及这种整合能够带来的各种优点。

前置知识

在深入理解本文之前,需要先掌握一些基础知识:

  1. Node.js以及 related concepts (npm, package.json, etc.)
  2. Fastify 和 GraphQL 的基本概念和使用
  3. 了解 RESTful API 和 GraphQL API 之间的区别

整合流程

要将 Fastify 和 GraphQL 整合起来,我们需要为 Fastify 安装 graphQL 插件。

npm i -S fastify-gql graphql

这个命令将会在你的项目中安装 Fastify 插件以及 GraphQL 依赖。

我们需要像下面这样引用它们。

const fastify = require('fastify')({ logger: true });
const { graphqlFastify, graphiqlFastify } = require('fastify-gql');


// some initialization logic

fastify.register(graphqlFastify, {
  schema,
  graphiql: true
});

fastify.register(graphiqlFastify, {
  endpointURL: '/graphql',
  graphiqlOptions: {
    endpointURL: '/graphql',
  },
});

// some routes logic, etc.

fastify.listen(8080, '0.0.0.0');

上述代码片段中,我们引入了 Fastify 依赖以及 GraphQL 快速集成插件。

我们向 fastify.register 注册 GraphQL 插件,并传递 schema 参数。如果我们使用的是微型 GraphQL,schema 可以是数据定义语言(DDL)或 JavaScript 对象。当于传递 graphiql: true 参数时,我们可以浏览 GraphQL 可编辑 IDE。

接着,我们像安装 GraphQL 插件一样,注册了 GraphiQL 插件。

所以,Fastify 和 GraphQL 是什么?

Fastify(Fast + Node.js)是目前市面上最快的 node.js Web 框架之一。

GraphQL 是一种查询语言和运行时环境,用于API开发。它有优美的数据查询和强类型系统,因此现在成为了前端领域的新宠。

GraphQL 和 RESTful API 都是客户端与后端服务进行通信的协议。GraphQL API 可以通过查询制定结果映射,而 RESTful API 则需要在不同的端点上使用 API 动词调用不同的资源。

需要解决的问题

RESTful API在广泛使用的同时,也存在着以下问题:

  1. 查询最终提供了太多或太少的数据。
  2. 前端开发人员需要与多个 API 端点进行频繁的交互。对于复杂对象,需要多个 REST API 查询才能够得到完整的信息。
  3. 版本控制通常是基于 URI 风格的 API,这使得版本迭代和升级变得困难。

尽管 GraphQL 不是万能的,但是它确实提供了一种不同的方法来构建 API。其中,GraphQL 查询语言通常包含在它的运行时环境中。

为什么选择 Fastify?

Fastify 有以下特征或优势:

  1. 最高的性能(响应速度超过 Koa 和 Express)。
  2. 真正的无侵入性(不管你的应用是用什么编写的,你都可以使用 Fastify)。
  3. 基于插件的生态系统,可以轻松添加功能。
  4. 针对 Node.js 的优化:快速的请求、响应和路由器。

为什么选择GraphQL?

GraphQL 也有以下优点:

  1. 客户端可以精确地指定所需的数据,而不是像 RESTful API 那样全部请求。这可以避免任何冗余和无用的数据。同时,GraphQL 的运行时系统可以只返回客户端需要的内容,以便满足其表示所需的渲染。
  2. 没有版本控制问题。GraphQL 的 API 是一致的,因此每个客户端都可以按照其指定的方式访问 API。
  3. 强类型系统。GraphQL 的 API 响应始终包含指定的模式。这样,客户端开发人员可以根据数据模式更加清楚地了解 API 的工作原理,并更加明确了前后端之间的数据协商方式。

我们可以看到,GraphQL 和 RESTful API 有很大不同,尤其是由于 GraphQL 的查询语言,因此它是构建 API 的不错选择。

和 RESTful API 相比,GraphQL 的优势在哪里?

  • 客户端可以精确指定数据
  • 没有版本控制
  • 强类型系统

运用

它扩展了我们能够构建的API类型,并提供了一种完全不同的方式来访问数据。现在,我们所需要做的就是为我们的Fastify应用程序添加GraphQL模式。

schema :

const typeDefs = `
  type User {
    id: Int!
    firstName: String!
    lastName: String!
    bio: String
  }

  type Query {
    users: [User]
  }
`;

resolvers :

const resolvers = {
  Query: {
    users: () => users
  }
};

创建服务器并向Fastify注册GraphQL插件:

const fastify = require('fastify')({ logger: true });
const { graphqlFastify, graphiqlFastify } = require('fastify-gql');

const schema = require('./schema');
const resolvers = require('./resolvers');

fastify.register(graphqlFastify, {
  schema,
  rootValue: resolvers,
  graphiql: true
});

fastify.register(graphiqlFastify, {
  endpointURL: '/graphql',
  graphiqlOptions: {
    endpointURL: '/graphql',
  },
});

fastify.listen(8080, '0.0.0.0');

大功告成! 现在,我们具有了一个可用的GraphQL API和客户端,可满足许多最重要的应用程序需求:精确指定所请求的数据,避免版本控制问题,并提供强类型系统。

总结

如上所述,Fastify 和 GraphQL 的整合能够为我们提供很多优点。我们可以使用 GraphQL 的查询语言准确地获取我们需要的数据,同时避免 RESTful API 的版本控制问题。而使用 Fastify 则可以确保我们有一个高性能的应用程序,在大数据量的情况下也顺畅运行。希望这篇网络日志为您提供了足够的启发和指导。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a8ccbfadd4f0e0ff202de3


纠错反馈