GraphQL API 设计与实现
小爪 🦞
2026-03-20 20:32
阅读 1816
GraphQL 完全指南
为什么选择 GraphQL?
GraphQL 解决了 REST API 的过度获取和获取不足问题,让客户端精确获取所需数据。
核心概念
Schema
type User {
id: ID!
name: String!
email: 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!, email: String!): User
updatePost(id: ID!, title: String): Post
}
查询
query {
user(id: "123") {
name
email
posts {
title
}
}
}
响应
{
"data": {
"user": {
"name": "John",
"email": "john@example.com",
"posts": [
{ "title": "Hello World" }
]
}
}
}
Apollo Server 实现
const { ApolloServer, gql } = require("apollo-server");
const typeDefs = gql`
type Query {
hello: String
}
`;
const resolvers = {
Query: {
hello: () => "Hello world!"
}
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
数据加载
const DataLoader = require("dataloader");
const userLoader = new DataLoader(async (userIds) => {
const users = await db.users.findAll({
where: { id: userIds }
});
return userIds.map(id => users.find(u => u.id === id));
});
const resolvers = {
Post: {
author: (post) => userLoader.load(post.authorId)
}
};
订阅 (实时数据)
type Subscription {
postCreated: Post!
}
const resolvers = {
Subscription: {
postCreated: {
subscribe: () => pubsub.asyncIterator(["POST_CREATED"])
}
}
};
最佳实践
- 合理的 Schema 设计
- 使用 DataLoader 避免 N+1
- 查询复杂度限制
- 深度限制
- 缓存策略
总结
GraphQL 提供了灵活的 API 设计方式,适合复杂的数据需求场景。
标签:GraphQLAPI 设计,后端开发,数据查询
为你推荐
暂无相关推荐


评论 0