GraphQL验证检查器Skill graphql-inspector-validate

这个技能用于验证GraphQL操作和文档是否符合架构规范,检查查询深度、别名数量、指令数量、令牌数量、复杂性分数等,以防止性能问题和安全风险。适用于前后端开发、DevOps流程、CI/CD集成、API开发、GraphQL架构验证和自动化测试。关键词:GraphQL, 验证, 操作, 文档, 架构, 深度限制, 复杂性, CI/CD, 开发工具, API开发, DevOps, 自动化验证, 性能优化, 安全检查。

DevOps 0 次安装 0 次浏览 更新于 3/25/2026

名称: graphql-inspector-validate 用户可调用: false 描述: 用于根据架构验证GraphQL操作/文档,检查查询深度、复杂性或片段使用情况。 允许的工具: [读取, 写入, 编辑, Bash, Glob, Grep]

GraphQL Inspector - 验证

GraphQL Inspector的验证命令的专家知识,用于根据可配置规则检查操作和文档与架构的匹配。

概述

验证命令检查GraphQL操作(查询、变更、订阅)和片段是否与架构匹配。它在运行时之前捕获错误,如未定义的字段、错误的参数类型和无效的片段扩展。

核心命令

基本验证

# 根据架构验证操作
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql'

# 从TypeScript文件验证操作
npx @graphql-inspector/cli validate './src/**/*.tsx' './schema.graphql'

# 使用全局模式验证
npx @graphql-inspector/cli validate './**/*.{graphql,gql}' './schema.graphql'

联邦支持

# Apollo Federation V1
npx @graphql-inspector/cli validate './operations/**/*.graphql' './schema.graphql' \
  --federation

# Apollo Federation V2
npx @graphql-inspector/cli validate './operations/**/*.graphql' './schema.graphql' \
  --federationV2

# AWS AppSync指令
npx @graphql-inspector/cli validate './operations/**/*.graphql' './schema.graphql' \
  --aws

验证规则

深度限制

防止可能导致性能问题的深度嵌套查询:

# 如果查询深度超过10则失败
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
  --maxDepth 10

违规示例:

# 深度为8 - 可能超过限制
query DeepQuery {
  user {                     # 1
    posts {                  # 2
      author {               # 3
        followers {          # 4
          posts {            # 5
            comments {       # 6
              author {       # 7
                name         # 8
              }
            }
          }
        }
      }
    }
  }
}

别名数量

限制别名使用以防止响应爆炸:

# 每个操作最多5个别名
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
  --maxAliasCount 5

违规示例:

# 6个别名 - 超过5个限制
query TooManyAliases {
  user1: user(id: "1") { name }
  user2: user(id: "2") { name }
  user3: user(id: "3") { name }
  user4: user(id: "4") { name }
  user5: user(id: "5") { name }
  user6: user(id: "6") { name }  # 超过限制
}

指令数量

限制指令以防止滥用:

# 每个操作最多10个指令
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
  --maxDirectiveCount 10

令牌数量

通过令牌数量限制查询复杂性:

# 每个操作最多1000个令牌
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
  --maxTokenCount 1000

复杂性分数

计算并限制查询复杂性:

# 最大复杂性分数为100
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
  --maxComplexityScore 100

配置文件

创建 .graphql-inspector.yaml

validate:
  schema: './schema.graphql'
  documents: './src/**/*.graphql'

  # 验证限制
  maxDepth: 10
  maxAliasCount: 5
  maxDirectiveCount: 10
  maxTokenCount: 1000
  maxComplexityScore: 100

  # 联邦支持
  federation: false
  federationV2: false
  aws: false

常见验证错误

未知字段

错误: 无法在类型“User”上查询字段“unknownField”。

修复: 检查字段名称拼写或将字段添加到架构。

错误的参数类型

错误: 参数“id”具有无效值“123”。
预期类型“ID!”,找到“123”(字符串)。

修复: 使用正确的参数类型。

缺少必需参数

错误: 字段“user”的参数“id”类型为“ID!”是必需的。

修复: 提供必需参数。

无效的片段扩展

错误: 片段“UserFields”无法在此处扩展,因为类型“Post”的对象永远不能是类型“User”。

修复: 确保片段类型与扩展位置匹配。

未使用的片段

警告: 片段“UnusedFragment”从未使用。

修复: 删除或使用该片段。

CI/CD集成

GitHub Actions

name: 验证操作
用户可调用: false
on:
  pull_request:
    paths:
      - 'src/**/*.graphql'
      - 'src/**/*.tsx'
      - 'schema.graphql'

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: 安装Inspector
        run: npm install -g @graphql-inspector/cli

      - name: 验证操作
        run: |
          graphql-inspector validate \
            'src/**/*.graphql' \
            schema.graphql \
            --maxDepth 10 \
            --maxAliasCount 5

预提交钩子

{
  "husky": {
    "hooks": {
      "pre-commit": "graphql-inspector validate 'src/**/*.graphql' schema.graphql"
    }
  }
}

从代码中提取操作

GraphQL Inspector可以从各种文件类型中提取操作:

TypeScript/JavaScript

// 模板文字中的操作被检测到
const GET_USER = gql`
  query GetUser($id: ID!) {
    user(id: $id) {
      name
      email
    }
  }
`;

React with GraphQL

// React文件中的标记模板文字
import { gql } from '@apollo/client';

const USER_QUERY = gql`
  query UserQuery {
    currentUser {
      id
      name
    }
  }
`;

最佳实践

  1. 在CI中验证 - 每次影响GraphQL文件的PR都运行验证
  2. 设置合理限制 - 从宽松限制开始,随时间收紧
  3. 针对生产架构验证 - 确保操作在生产中工作
  4. 从代码中提取操作 - 验证所有操作,不仅是.graphql文件
  5. 使用联邦标志 - 如果使用Apollo Federation则启用
  6. 警告视为错误 - 在CI中将未使用的片段视为错误
  7. 版本化架构 - 针对特定架构版本验证
  8. 记录限制 - 向开发人员解释限制存在的原因

常见模式

多架构验证

对于具有多个架构的单体仓库:

# 针对特定服务架构验证
npx @graphql-inspector/cli validate \
  './packages/app/src/**/*.graphql' \
  './packages/api/schema.graphql'

# 针对联邦超图验证
npx @graphql-inspector/cli validate \
  './packages/web/src/**/*.graphql' \
  './supergraph.graphql' \
  --federationV2

增量采用

从宽松开始,随时间添加更严格的规则:

# 阶段1: 仅基本验证
validate:
  schema: './schema.graphql'
  documents: './src/**/*.graphql'

# 阶段2: 添加深度限制
validate:
  schema: './schema.graphql'
  documents: './src/**/*.graphql'
  maxDepth: 15

# 阶段3: 添加复杂性限制
validate:
  schema: './schema.graphql'
  documents: './src/**/*.graphql'
  maxDepth: 10
  maxAliasCount: 10
  maxComplexityScore: 200

故障排除

“架构文件未找到”

  • 验证架构路径是否正确
  • 检查全局模式是否匹配架构位置
  • 如果相对路径失败,使用绝对路径

“未找到文档”

  • 检查全局模式是否匹配操作文件
  • 验证文件扩展名是否正确
  • 确保文件包含GraphQL操作

“未知指令”

  • 为联邦指令添加--federation--federationV2
  • 为AppSync指令添加--aws
  • 检查自定义指令是否在架构中定义

代码中未检测到操作

  • 确保使用标记模板文字(gql\…``)
  • 检查文件扩展名是否包含在全局中
  • 验证GraphQL Inspector可以解析文件类型

何时使用此技能

  • 在CI/CD中设置操作验证
  • 强制执行查询复杂性限制
  • 在部署前验证操作
  • 早期捕获架构-操作不匹配
  • 防止深度嵌套查询
  • 审计现有操作是否符合规定