GraphQL JavaScript 库 (Node.js):Apollo Server 与工具完全指南

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

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

开始课程

用于 Node.js 的 GraphQL 库:Apollo Server 与开发工具



GraphQL 是一种 API 查询语言,它允许客户端仅请求所需的数据。对于 Node.js 开发,最流行的库是 Apollo Server。它提供了一套完整的工具,用于创建、测试和部署 GraphQL API。在本文中,我们将详细解析关键组件、方法和代码示例。



什么是 Apollo Server?

Apollo Server 是一个开源库,允许您在 Node.js 上快速创建 GraphQL 服务器。它支持多种传输方式(HTTP、WebSocket),并能轻松与框架(Express、Koa、Fastify)集成。主要功能:

  • 通过 GraphQL Playground 自动生成文档。
  • 通过 WebSocket 支持订阅(subscriptions)。
  • 数据缓存与合并机制(data loaders)。
  • 灵活的 middleware 系统,用于身份验证和授权。


安装与基本配置

首先,安装 apollo-server 和 graphql 包:

npm install apollo-server graphql


创建一个返回问候语的简单服务器:

const { ApolloServer, gql } = require('apollo-server');

// 定义模式 (SDL)const typeDefs = gql` type Query { hello: String }`;

// 解析器——返回数据的函数const resolvers = { Query: { hello: () => 'Hello, GraphQL!', },};

// 启动服务器const server = new ApolloServer({ typeDefs, resolvers });server.listen().then(({ url }) => { console.log(`🚀 服务器已启动,地址为 ${url}`);});


数据类型与模式

在 GraphQL 中,模式定义了所有可用的类型和操作。基本类型:

  • String、Int、Float、Boolean、ID——标量类型。
  • [Type]——对象列表。
  • type——自定义对象。
  • input——用于变更输入参数的类型。


博客模式示例:

type User {  id: ID!  name: String!  posts: [Post!]!}

type Post { id: ID! title: String! content: String! author: User!}

type Query { user(id: ID!): User posts(limit: Int): [Post!]!}

type Mutation { createUser(name: String!): User!}


解析器:模式与数据的连接

模式中的每个字段都必须有对应的解析器。解析器可以从数据库(MongoDB、PostgreSQL)、外部 API 或静态数组中获取数据。

const users = [  { id: '1', name: '安娜' },  { id: '2', name: '鲍里斯' },];

const posts = [ { id: '10', title: 'GraphQL 入门', content: '...', authorId: '1' }, { id: '20', title: 'Node.js 技巧', content: '...', authorId: '2' },];

const resolvers = { Query: { user: (_, { id }) => users.find(u => u.id === id), posts: (_, { limit }) => limit ? posts.slice(0, limit) : posts, }, Mutation: { createUser: (_, { name }) => { const newUser = { id: String(users.length + 1), name }; users.push(newUser); return newUser; }, }, User: { posts: (parent) => posts.filter(p => p.authorId === parent.id), },};


使用 TypeGraphQL 的 Code-first 方法

对于大型项目,使用 code-first 方法更为方便,即模式从 TypeScript 类生成。type-graphql 库允许您编写同时作为类型和解析器的代码。

npm install type-graphql reflect-metadata class-validator


实体类示例:

import { ObjectType, Field,                    

推荐