前言
GraphQL 是一种用于 API 的查询语言和运行时环境,由 Facebook 开源。它不同于传统的 RESTful API,具有类型检查、强大的查询功能和灵活的响应数据格式等优点,已经被越来越多的公司和开发者所接受和使用。
本文将介绍如何在 Node.js 应用程序中使用 GraphQL,并为读者提供深度的学习和指导。在阅读本文前,需要读者已经具备一定的 Node.js 和 GraphQL 基础知识。
安装与配置
在 Node.js 中使用 GraphQL,需要安装 graphql
和 express-graphql
两个模块。graphql
模块提供了构建和执行 GraphQL 查询的核心功能,而 express-graphql
则增加了一个 Express 中间件用于处理 GraphQL 请求。
安装命令为:
npm install graphql express-graphql --save
在应用程序中引入模块:
const express = require('express') const graphqlHTTP = require('express-graphql') const { GraphQLSchema, GraphQLObjectType, GraphQLString } = require('graphql')
构建 GraphQL Schema:
-- -------------------- ---- ------- ----- ------ - --- --------------- ------ --- ------------------- ----- ------------------ ------- -- -- -- -------- - ----- -------------- -------- -- -- ------- ------- - -- -- --
创建 Express 应用程序:
-- -------------------- ---- ------- ----- --- - --------- ------------------- ------------- ------- ------- --------- ---- --- ----- ---- - ---- ---------------- -- -- - ------------------- -- --------- -- ---- --------- --
启动应用程序,并访问 http://localhost:3000/graphql,可以看到 GraphiQL 工具界面。
输入以下查询语句:
{ message }
点击运行按钮,可以在右侧查看结果:
{ "data": { "message": "Hello, world!" } }
基本类型
GraphQL 支持的基本类型包括 Scalar、List 和非空类型。
Scalar 类型用于表示基本数据类型,如字符串、数字、布尔值等。GraphQL 提供了以下几种 Scalar 类型:
Scalar 类型 | 描述 |
---|---|
Int |
有符号 32 位整数类型 |
Float |
有符号双精度浮点类型 |
String |
Unicode 字符串类型 |
Boolean |
布尔类型 |
ID |
标识符类型,用于唯一标识对象 |
List 类型用于表示数组类型,可以使用中括号将其包裹。例如,以下类型定义表示一个字符串数组:
type Query { names: [String] }
非空类型用于表示必填字段,可以在类型名称后面添加一个 !
告诉 GraphQL 该字段是非空类型。例如,以下类型定义表示一个必须包含 name
字段的对象类型:
type Person { id: ID! name: String! age: Int }
数据源
在实际项目中,通常需要从数据库或外部 API 中获取数据。可以通过定义 Resolvers 来完成与数据源的交互。
Resolvers 是一个返回包含字段值的对象的函数。每个字段都有一个 Resolver,当查询中包含该字段时,会执行该 Resolver,并返回对应的数据。
以下是一个简单的数据源示例,使用了 lodash
模块模拟了一个人员列表:
-- -------------------- ---- ------- ----- - - ----------------- ----- ------ - - - --- -- ----- -------- ---- -- -- - --- -- ----- ------ ---- -- -- - --- -- ----- ---------- ---- -- - - ----- ------------- - ---- -- - ------ -------------- - --- ------------ -- - ----- --------- - -- -- - ------ ------ -
定义 Resolver:
const rootResolver = { person: ({ id }) => getPersonById(id), people: () => getPeople() }
修改 Schema:
-- -------------------- ---- ------- ----- ------ - --- --------------- ------ --- ------------------- ----- -------- ------- -- -- -- ------- - ----- ----------- ----- - --- - ----- ------------------------- - -- -------- ------------------- -- ------- - ----- ------------------------ -------- ------------------- - -- -- --
以上代码中,PersonType
是一个自定义类型,使用了上文所述的非空类型和列表类型。
Mutation
除了查询外,GraphQL 还支持修改数据的操作,称为 Mutation。与查询类似,Mutation 也可以定义自己的类型和 Resolvers。
例如,以下是一个简单的 Mutation 示范,用于向人员列表中添加新的人员:
声明 Mutation Type:
type Mutation { addPerson(name: String!, age: Int): Person }
定义 Resolver:
-- -------------------- ---- ------- ----- --------- - -- ----- --- -- -- - ----- ------ - - --- ----------------- - -- ----- ----- ---- --- - ------------------- ------ ------ - ----- ------------ - - -- --- ---------- -- ----- --- -- -- ----------- ----- --- -- -
修改 Schema:
-- -------------------- ---- ------- ----- ------ - --- --------------- ------ -- --- ---- -- ------ --------- --- ------------------- ----- ----------- ------- -- -- -- ---------- - ----- ----------- ----- - ----- - ----- ----------------------------- -- ---- - ----- ---------- - -- -------- ---------------------- - -- -- --
在 GraphiQL 中执行以下 Mutation 语句:
mutation { addPerson(name: "David", age: 35) { id name age } }
可以看到返回值中包含新添加的人员信息:
-- -------------------- ---- ------- - ------- - ------------ - ----- ---- ------- -------- ------ -- - - -
总结
本文介绍了如何在 Node.js 应用程序中使用 GraphQL,从安装和配置开始,逐步深入讲解了 GraphQL 的基础概念、基本类型、数据源和 Mutation 等内容,并提供了示例代码供读者参考。
希望本文对读者能有所帮助,更多 GraphQL 相关知识,请阅读官方文档。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648acdc448841e98949009b5