GraphQL: Cannot query field "X" on type "Y"
Cómo resolver el error 'Cannot query field' en GraphQL. Causas por campos inexistentes, typos en el schema y cómo inspeccionar el schema con introspección.
¿Por qué ocurre?
GraphQL valida cada query contra el schema antes de ejecutarla. El error ocurre cuando: - El campo no existe en el tipo del schema (typo o nombre incorrecto) - El campo existe pero en un tipo diferente al que estás consultando - El schema ha cambiado (campo renombrado o eliminado) pero la query no se actualizó - Estás consultando un campo de un fragmento en el tipo incorrecto - El campo es de un tipo anidado y no está correctamente delegado en el resolver
Solución paso a paso
1. Inspeccionar el schema con introspección
# Ver todos los tipos del schema
query {
__schema {
types {
name
fields {
name
type { name }
}
}
}
}# Ver los campos de un tipo específico
query {
__type(name: "User") {
fields {
name
type {
name
kind
}
}
}
}
2. Usar GraphQL Playground / Apollo Sandbox
Abre http://localhost:4000/graphql en tu navegador. El explorador interactivo muestra autocompletado de todos los campos disponibles.
3. Corregir el nombre del campo
# ❌ Error: typo en el campo
query GetUser {
user(id: "1") {
nombre # ← no existe
apellido # ← no existe
}
}# ✅ Correcto: usar los nombres exactos del schema
query GetUser {
user(id: "1") {
name # ← nombre exacto en el schema
lastName # ← camelCase como en el schema
}
}
4. Verificar el schema en código (Apollo Server)
import { gql } from 'apollo-server'const typeDefs = gql
type User {
id: ID!
name: String! # ← así se llama el campo
lastName: String # ← así se llama el campo
email: String!
posts: [Post!]!
}
type Query {
user(id: ID!): User
users: [User!]!
}
5. Error con fragmentos: asegurarse del tipo correcto
# ❌ Error: el fragmento se aplica al tipo incorrecto
fragment UserFields on Post { # ← debería ser "on User"
name
email
}# ✅ Correcto
fragment UserFields on User {
name
email
}
query {
user(id: "1") {
...UserFields
}
}
6. Schema stitching / federación: campo no delegado
// En Apollo Federation, asegurarse de que el resolver resuelve el campo
const resolvers = {
Query: {
user: (_, { id }) => ({ id }),
},
User: {
// ✅ Resolver explícito para el campo
profile: async (parent) => {
return await fetchProfile(parent.id)
}
}
}
Cómo evitarlo en el futuro
- Genera tipos TypeScript desde el schema con `graphql-codegen` para tener errores en compilación - Usa Apollo Studio o GraphQL Playground para explorar el schema antes de escribir queries - En el frontend, usa fragmentos tipados para que los cambios del schema se detecten automáticamente - Activa las validaciones de ESLint para GraphQL con `@graphql-eslint/eslint-plugin`
¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:
Generador de Prompts