使用 JavaScript 构建 GraphQL API:Node.js 逐步教程

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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}`);});

博客

书籍推荐