web-dev-qa-db-fra.com

Erreur GraphQL - le type d'argument doit être Input Type mais a obtenu: non défini

J'ai

export const getPicture = {
    type: GraphPicture,
    args: {
        type: new GraphQLNonNull(GraphQLInt)
    },
    resolve(_, args) {
        return Picture.findByPrimary(args.id);
    }
};

export const getPictureList = {
    type: new GraphQLList(GraphPicture),
    resolve(_, __, session) {
        return Picture.findAll({where: {owner: session.userId}});
    }
};

et

const query = new GraphQLObjectType({
    name: 'Queries',
    fields: () => {
        return {
            getPictureList: getPictureList,
            getPicture: getPicture
        }
    }
});

const schema = new GraphQLSchema({
    query: query,
    mutation: mutation
});

Ce qui jette:

Error: Queries.getPicture(type:) argument type must be Input Type but got: undefined.

getPictureList fonctionne correctement, getPicture échoue.

J'ai essayé de faire de getPicture un GraphQLLIst, cela n'aide pas.

J'ai essayé de faire du type args un type d'entrée, ça n'aide pas.

Toutes les idées sur ce qui se passe ici

La trace de pile est:

Error: Queries.getPicture(type:) argument type must be Input Type but got: undefined.
at invariant (/home/jrootham/dev/trytheseon/node_modules/graphql/jsutils/invariant.js:19:11)
at /home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:307:33
at Array.map (native)
at /home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:304:52
at Array.forEach (native)
at defineFieldMap (/home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:293:14)
at GraphQLObjectType.getFields (/home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:250:46)
at /home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:224:27
at typeMapReducer (/home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:236:7)
at Array.reduce (native)
at new GraphQLSchema (/home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:104:34)
at Object.<anonymous> (/home/jrootham/dev/trytheseon/server/graphQL.js:45:16)
at Module._compile (module.js:399:26)
at normalLoader (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:160:5)
at Object.require.extensions.(anonymous function) [as .js] (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:173:7)
at Module.load (module.js:345:32)
at Function.Module._load (module.js:302:12)
at Module.require (module.js:355:17)
at require (internal/module.js:13:17)
at Object.<anonymous> (/home/jrootham/dev/trytheseon/devServer.js:14:44)
at Module._compile (module.js:399:26)
at normalLoader (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:160:5)
15
Jim Rootham

Le problème n'est pas le type de retour de la requête mais le type que vous avez spécifié pour vos arguments.

export const getPicture = {
    type: GraphPicture,
    args: {
        type: new GraphQLNonNull(GraphQLInt)
    },
    resolve(_, args) {
        return Picture.findByPrimary(args.id);
    }
};

En supposant que vous vouliez avoir un argument nommé "type", il devrait être:

export const getPicture = {
    type: GraphPicture,
    args: {
        type: {
             type: new GraphQLNonNull(GraphQLInt)
        }
    },
    resolve(_, args) {
        return Picture.findByPrimary(args.id);
    }
};

voici un exemple du repo graphql-js:

hero: {
  type: characterInterface,
  args: {
    episode: {
      description: 'If omitted, returns the hero of the whole saga. If ' +
                   'provided, returns the hero of that particular episode.',
      type: episodeEnum
    }
  },
  resolve: (root, { episode }) => getHero(episode),
},

Voir le schéma complet du référentiel graphql-js ici: https://github.com/graphql/graphql-js/blob/master/src/ tests /starWarsSchema.js

13
Brad Decker

Juste pour référence, je suis arrivé ici en cherchant la même erreur non seulement avec undefined, mais avec mon propre type Product:

... argument * must be Input Type but got Product

Il s'est avéré que dans GraphQL ce que vous transmettez à une mutation doit être de type scalaire (chaîne, entier, ...) ou défini par l'utilisateur input type, pas type type.

http://graphql.org/graphql-js/mutations-and-input-types/

input ProductInput {
  id: ID
  name: String
}

J'essayais de transmettre mon produit type:

type Product {
  id: ID
  name: String
}

Cela semble un peu redondant, mais devinez, je serai heureux de l'avoir séparé plus tard.

16
kub1x