关于 graphql-implementation
面向开发者的 GraphQL API 实现参考,涵盖模式设计、解析器和性能优化。提供 Apollo Server 与 Python Graphene 示例,并说明输入验证、错误处理和避免 N+1 查询的方法。
主要功能
- 01定义模式和解析器
- 02配置 Apollo Server
- 03使用 DataLoader 批量查询
- 04通过 GraphQLError 处理错误
- 05设置查询复杂度限制
- 06将 Graphene 集成到 Flask
适用场景
- 01使用 Apollo Server 构建 GraphQL API
- 02借助 DataLoader 避免 N+1 查询
- 03验证输入并规范 API 错误
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill graphql-implementation安装后在 Claude Code 中输入/graphql-implementation确认已加载。
附带文件references/python-graphene.md
详细介绍
GraphQL 实现
构建 GraphQL API,并做好架构设计、解析器和性能优化。
架构定义
type User {
id: ID!
name: String!
email: String!
posts(limit: Int = 10): [Post!]!
}
type Post {
id: ID!
title: String!
content: String!
author: User!
createdAt: DateTime!
}
type Query {
user(id: ID!): User
users(limit: Int, offset: Int): [User!]!
post(id: ID!): Post
}
type Mutation {
createUser(input: CreateUserInput!): User!
createPost(input: CreatePostInput!): Post!
}
input CreateUserInput {
name: String!
email: String!
}
Apollo Server 设置
const { ApolloServer } = require('@apollo/server');
const { startStandaloneServer } = require('@apollo/server/standalone');
const resolvers = {
Query: {
user: (_, { id }, { dataSources }) =>
dataSources.userAPI.getUser(id),
users: (_, { limit, offset }, { dataSources }) =>
dataSources.userAPI.getUsers({ limit, offset })
},
User: {
posts: (user, { limit }, { dataSources }) =>
dataSources.postAPI.getPostsByUser(user.id, limit)
},
Mutation: {
createUser: (_, { input }, { dataSources }) =>
dataSources.userAPI.createUser(input)
}
};
const server = new ApolloServer({ typeDefs, resolvers });
使用 DataLoader 防止 N+1 问题
const DataLoader = require('dataloader');
const userLoader = new DataLoader(async (ids) => {
const users = await User.find({ _id: { $in: ids } });
return ids.map(id => users.find(u => u.id === id));
});
错误处理
const { GraphQLError } = require('graphql');
throw new GraphQLError('User not found', {
extensions: { code: 'NOT_FOUND', argumentName: 'id' }
});
最佳实践
- 使用 DataLoader 批量处理查询
- 设置查询复杂度限制
- 围绕客户端需求设计架构
- 验证所有输入
- 使用描述性命名约定
Python Graphene
请参阅 references/python-graphene.md,了解完整的 Flask 实现,包括:
- ObjectType 定义
- Query 和 Mutation 类
- 输入类型
- Flask 集成
最佳实践
应该:
- 使用 DataLoader 批量处理查询
- 设置查询复杂度限制
- 围绕客户端需求设计架构
- 验证所有输入
- 使用描述性命名约定
- 添加订阅以获取实时数据
不应该:
- 允许不受限制的深度嵌套查询
- 暴露数据库内部信息
- 忽视 N+1 查询问题
- 返回未经授权的数据
- 跳过输入验证
评论
支持 Markdown