mcpField
G
graphql-implementation

graphql-implementation

github.com/secondsky开发242388 次安装5 周前更新
代码仓库

关于 graphql-implementation

面向开发者的 GraphQL API 实现参考,涵盖模式设计、解析器和性能优化。提供 Apollo Server 与 Python Graphene 示例,并说明输入验证、错误处理和避免 N+1 查询的方法。

主要功能

  1. 01定义模式和解析器
  2. 02配置 Apollo Server
  3. 03使用 DataLoader 批量查询
  4. 04通过 GraphQLError 处理错误
  5. 05设置查询复杂度限制
  6. 06将 Graphene 集成到 Flask

适用场景

  1. 01使用 Apollo Server 构建 GraphQL API
  2. 02借助 DataLoader 避免 N+1 查询
  3. 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