GraphQL API 与 JavaScript:Node.js 的逐步教程
GraphQL 是一种由 Facebook 开发的强大的 API 查询语言。与 REST 不同,在 REST 中你会得到固定的数据结构,而 GraphQL 允许客户端只请求其需要的内容。在本教程中,我们将使用 Node.js 和 Apollo Server 创建一个完整的 GraphQL API。你将学习如何配置服务器、定义模式、编写解析器以及执行查询和变更。
什么是 GraphQL 以及为什么需要它?
GraphQL 解决了 REST API 的几个问题:
- 数据过载:客户端只获得其请求的字段。
- 多次请求:一个 GraphQL 查询可以替代多个 REST 端点。
- 强类型:模式定义了数据类型和它们之间的关系。
JavaScript(Node.js)由于拥有庞大的包生态和异步特性,是创建 GraphQL API 的理想选择。
步骤 1:项目安装与配置
创建一个新目录并初始化项目:
mkdir graphql-api-tutorialcd graphql-api-tutorialnpm init -y安装必需的依赖:
npm install apollo-server graphql创建文件 index.js —— 这将是我们应用的入口点。
步骤 2:定义 GraphQL 模式
模式是 GraphQL API 的核心。它描述了数据类型和可用操作(查询、变更、订阅)。我们来创建一个简单的模式用于管理图书。
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql` type Book { id: ID! title: String! author: String! year: Int }
type Query { books: [Book] book(id: ID!): Book }
type Mutation { addBook(title: String!, author: String!, year: Int): Book deleteBook(id: ID!): Book }`;这里我们定义了:
- Book —— 一个包含 id、title、author、year 字段的对象类型。
- Query —— 用于读取数据的入口点(图书列表和按 ID 查书)。
- Mutation —— 数据修改操作(添加和删除图书)。
步骤 3:编写解析器
解析器是为模式中每个字段返回数据的函数。我们创建一个模拟数据库(对象数组)并实现解析器。
let books = [ { id: '1', title: '1984', author: 'George Orwell', year: 1949 }, { id: '2', title: 'To Kill a Mockingbird', author: 'Harper Lee', year: 1960 },];
const resolvers = { Query: { books: () => books, book: (parent, args) => books.find(book => book.id === args.id), }, Mutation: { addBook: (parent, args) => { const newBook = { id: String(books.length + 1), title: args.title, author: args.author, year: args.year, }; books.push(newBook); return newBook; }, deleteBook: (parent, args) => { const index = books.findIndex(book => book.id === args.id); if (index === -1) return null; const deletedBook = books.splice(index, 1)[0]; return deletedBook; }, },};请注意结构:Query 和 Mutation 是包含解析器方法的对象。每个解析器接收三个参数:parent(父解析器的结果)、args(查询参数)和 context(上下文对象,例如用于认证)。
步骤 4:启动服务器并测试
现在将模式和解析器连接到 Apollo Server:
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`);});
博客
书籍推荐
推荐阅读