recientemente empecé a trabajar en GraphQL, soy capaz de insertar los datos en el plano de esquema sin ningún problema, pero cuando se trata de una Matriz de datos que estoy recibiendo un error como

 { "errors": [ {  "message": "Must be input type" } ]}

Estoy probando mi consulta mediante cartero, mi mutación consulta es

mutation M { 

AddEvent
  (

    title: "Birthday event"   

    description:"Welcome to all" 

    media:[{url:"www.google.com", mediaType:"image" }]

    location:[{address:{state:"***", city:"****"}}]

   ) 

{title,description,media,location,created,_id}}

Este es mi Esquema de Evento:

EventType = new GraphQLObjectType({
name: 'Event',
description: 'A Event',
fields: () => ({
_id: {
type: GraphQLString,
description: 'The id of the event.',
},
id: {
type: GraphQLString,
description: 'The id of the event.',
},
title: {
type: GraphQLString,
description: 'The title of the event.',
},
description: {
type: GraphQLString,
description: 'The description of the event.',
},
media:{
type:new GraphQLList(mediaType),
description:'List of media',   
},
location:{
type:new GraphQLList(locationType),
description:'List of location',   
}  
})
});
//Media Type
export var mediaType = new GraphQLObjectType({
name: 'Media',
description: 'A Media',
fields: () => ({
_id: {
type: GraphQLString,
description: 'The id of the event.',
},
url:{
type: GraphQLString,
description: 'The url of the event.',
},
mediaType:{
type: GraphQLString,
description: 'The mediaTypa of the event.',
}
})
});
//Location Type
export var locationType = new GraphQLObjectType({
name: 'Location',
description: 'A location',
fields: () => ({
_id: {
type: GraphQLString,
description: 'The id of the event.',
},
address:{
type: GraphQLString,
description: 'The address.',
},
state:{
type: GraphQLString,
description: 'The state.',
},
city:{
type: GraphQLString,
description: 'The city.',
},
zip:{
type: GraphQLString,
description: 'The zip code.',
},
country:{
type: GraphQLString,
description: 'The country.',
}
})
});

Mangosta Esquema:

var EventSchema = new mongoose.Schema({
title: {
required: true,
type: String,
trim: true,
match: /^([\w ,.!?]{1,100})$/
},
description: {
required: false,
type: String,
trim: true,
match: /^([\w ,.!?]{1,100})$/
},
media: [{
url: {
type: String,
trim: true
},
mediaType: {
type: String,
trim: true
}
}],
location: [{
address: {
type: String
},
city: {
type: String
},
state: {
type: String
},
zip: {
type: String
},
country: {
type: String
}
}]
})

Mutación Tipo:

 addEvent: {
type: EventType,
args: {
_id: {
type: GraphQLString,
description: 'The id of the event.',
},
title: {
type: GraphQLString,
description: 'The title of the event.',
},
description: {
type: GraphQLString,
description: 'The description of the event.',
},
media:{
type:new GraphQLList(mediaType),
description:'List of media',   
},
location:{
type:new GraphQLList(locationType),
description:'List of media',   
},
created: {
type: GraphQLInt,
description: 'The created of the user.',       
} 
},
resolve: (obj, {title,description,media,location,created,_id}) => {
let toCreateEvent = {
title,
description,
created:new Date(),
start: new Date(),
media,
location,
_id,
};
return mongo()
.then(db => {
return  new Promise(
function(resolve,reject){
let collection = db.collection('events');
collection.insert(toCreateEvent, (err, result) => {
db.close();
if (err) {
reject(err);
return;
}
resolve(result);
});
})
});
}
}
  • Yo he hecho algo similar a esto (utilizando matrices) y funciona. Podría usted compartir su esquema?
  • Hola mfirry, he añadido mi Mangosta y GraphQL Esquemas para el post. Por favor, compruebe ellos y me dan la respuesta tan pronto como sea posible. Gracias!!
  • También tengo la MutationType en el que se definen AddEvent
  • Por favor revisar mi código he añadido el tipo de mutación. gracias…
  • Lo sentimos, no hay tiempo suficiente para trabajar en su ejemplo. Voy a enlazar a mi pequeño (de trabajo) de la muestra con la esperanza de que esto le ayuda a usted de todos modos. gist.github.com/mfirry/1ba61efcd31f7c744476
  • Gracias por tu ayuda, pero yo no estoy en esta misma situación.Estoy tratando de insertar una matriz con un diccionario, no una matriz. Por favor, compruebe la UBICACIÓN en el Esquema de eventos(mangosta Esquema).
  • este ejemplo funciona porque, en su airports mutación definición, type: new GraphQLList(GraphQLString), GraphQLList y GraphQLString ya están los tipos de entrada, pero cuando se crea un tipo personalizado como @Mahesh usted necesita para crear con GraphQLInputObjectType si quieres usarlo en las mutaciones. Véase mi respuesta a continuación.

InformationsquelleAutor Mahesh | 2015-08-31

2 Comentarios

  1. 22

    Su problema es que, al definir las mutaciones, todos los tipos de tipos de entrada, de ahí el error que se obtiene "Must be input type". Así que aquí (a partir de la mutación):

    media:{
    type:new GraphQLList(mediaType),
    description:'List of media',   
    },
    location:{
    type:new GraphQLList(locationType),
    description:'List of media',   
    },

    GraphQLList, mediaType y locationType deben ser los tipos de entrada.

    GraphQLList ya es un tipo de entrada (ver aquí https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L74-L82 para ver la lista de GraphQL tipos considerados como tipos de entrada).

    Sin embargo, sus tipos mediaType y locationType son de GraphQLObjectType tipo, que no es un tipo de entrada, pero si nos fijamos en la lista de tipos de entrada de nuevo: https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L74-L82, usted encontrará GraphQLInputObjectType que es un objeto del tipo de entrada, por lo que, lo que usted necesita hacer es reemplazar mediaType y locationType por su «entrada» de la versión.

    Lo que te sugiero hacer es crear mediaInputType y locationInputType que tendría la misma estructura de campo como mediaType y locationType, pero con new GraphQLInputObjectType({... en lugar de new GraphQLObjectType({... y utilizar en su mutación.

    Me encontré con el mismo problema y lo he resuelto así, siéntete libre de comentar si usted tiene cualquier pregunta.

  2. 4

    Me encontré con el mismo problema – no sabía cómo especificar la matriz de objetos en la definición de la entrada. Así que para aquellos que quieran ver un «texto» esquema de solución:

    type Book {
    title: String!
    }

    tener una variedad de Libros en su tipo de entrada

    input AuthorInput {
    name: String!
    age: Int!
    }

    no se puede simplemente añadir books: [Book!] dentro de la instrucción de entrada, deberá crear deliberadamente el tipo de entrada que contiene los campos requeridos (duplicado si te gusta):

    input BookInput {
    title: String!
    }

    y, a continuación, usted puede:

    input AuthorInput {
    name: String!
    age: Int!
    books: [BookInput!]
    }

Dejar respuesta

Please enter your comment!
Please enter your name here