用于 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,