Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

216
Vistas
Esquema personalizado Keystone 6 - la mutación no funciona - Se excedió el tamaño máximo de la pila de llamadas

Estoy tratando de extender una mutación en Keystone 6, pero tengo muchos problemas para obtener la actualización estándar de la base de datos para que funcione en un solucionador de mutaciones personalizado; Usando el modelo Keystone estándar y agregando una nueva colección/lista.

Siguiendo los ejemplos aquí , he emparejado custom-schema.ts con el schema.graphql generado

esquema.graphql (simplificado):

 type Dog { id: ID! name: String } input DogWhereUniqueInput { id: ID } input DogUpdateInput { name: String } type Mutation { updateDog( where: DogWhereUniqueInput! data: DogUpdateInput! ): Dog }

esquema personalizado.ts:

 import { graphQLSchemaExtension } from '@keystone-6/core'; import { Context } from '.keystone/types'; export const extendGraphqlSchema = graphQLSchemaExtension<Context>({ typeDefs: ` type Mutation { """ update a dog """ updateDog( where: DogWhereUniqueInput! data: DogUpdateInput! ): Dog } `, resolvers: { Mutation: { updateDog: async (root, { where, id }, context) => { try { const response = await context.db.Dog.updateOne({ where: { id }, data: { name: 'updated name'} }); return response; } catch (updateError: any) { throw updateError; } }} } }, );

keystone.ts:

 import { extendGraphqlSchema } from './custom-schema'; // ... export default withAuth( config({ db: { provider: 'sqlite', url: 'file:./keystone.db', }, ui: { isAccessAllowed: (context) => !!context.session?.data, }, lists, session, extendGraphqlSchema, }) );

Cuando activé una actualización desde la interfaz de usuario (repetitiva), recibo este error repetidamente desde el controlador de errores de captura. Lo mismo sucede en el patio de recreo de graphQL. Realmente me cuesta entender lo que está sucediendo y por qué el resolutor recibe spam y genera este error.

 RangeError: Maximum call stack size exceeded at isLeafType (.../poc/node_modules/graphql/type/definition.js:247:20) at coerceInputValueImpl (.../poc/node_modules/graphql/utilities/coerceInputValue.js:122:34)

¿Por qué sucede esto, cómo solucionarlo? ¿Me estoy perdiendo algo obvio?

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Esto se debe a que tanto context.db como context.query internamente todavía usan la API de GraphQL para CRUD. Y dado que su mutación personalizada updateDog también tiene el mismo nombre que la mutación generada a partir del esquema updateDog , ambas mutaciones se invocan repetidamente entre sí y, por lo tanto, aparece el error RangeError: Maximum call stack size exceeded .

Puede resolver su problema de una de las dos maneras:

  1. Cambie el nombre de su mutación personalizada a otra cosa. P.ej. updateDogCustom

    o

  2. (Tenga cuidado) En lugar de context.db.Dog.updateOne , use el cliente prisma para omitir la capa de datos de keystone y CRUD la base de datos directamente. Tenga cuidado, esto significa que si tiene ganchos, control de acceso o lógica de validación en su lugar, no se invocarán.

 export const extendGraphqlSchema = graphQLSchemaExtension<Context>({ typeDefs: ` type Mutation { """ update a dog """ updateDog( where: DogWhereUniqueInput! data: DogUpdateInput! ): Dog """ update a dog custom """ updateDogCustom( where: DogWhereUniqueInput! data: DogUpdateInput! ): Dog } `, resolvers: { Mutation: { updateDog: async (root, { where: { id }, data: { name } }, context) => { try { const response = await context.prisma.dog.update({ where: { id }, data: { name }, }); return response; } catch (updateError: any) { throw updateError; } }, updateDogCustom: async ( root, { where: { id }, data: { name } }, context ) => { try { const response = await context.db.Dog.updateOne({ where: { id }, data: { name }, }); return response; } catch (updateError: any) { throw updateError; } }, }, }, });

Codesandbox aquí: https://codesandbox.io/s/winter-shadow-fz689e?file=/src/custom-schema.ts

Puede ejecutar el área de juegos de graphql directamente desde codesandbox desde la ruta /api/graphql . P.ej. https://fz689e.sse.codesandbox.io/api/graphql

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda