web-dev-qa-db-ja.com

GraphQLエラー-引数の型は入力型でなければなりませんが、取得されました:未定義

私が持っています

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}});
    }
};

そして

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

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

投げる:

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

getPictureListは正常に機能し、getPictureは失敗します。

GetPictureをGraphQLLIstにしようとしましたが、役に立ちません。

Argsタイプを入力タイプにしようとしましたが、役に立ちません。

ここで起こっていることについてのアイデア

スタックトレースは次のとおりです。

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

問題は、クエリの戻り値の型ではなく、引数に指定した型です。

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

「type」という名前の引数を想定しているとすると、次のようになります。

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

以下は、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),
},

ここでgraphql-jsリポジトリの完全なスキーマを参照してください: https://github.com/graphql/graphql-js/blob/master/src/tests/ starWarsSchema.js

13
Brad Decker

参考までに、undefinedではなく、自分のProductタイプで同じエラーを検索しました:

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

GraphQLでは、Mutationに渡すものはスカラー型(文字列、整数、...)またはユーザー定義inputtypeタイプではなくタイプ。

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

input ProductInput {
  id: ID
  name: String
}

製品typeを渡そうとしました:

type Product {
  id: ID
  name: String
}

これは少し冗長に感じられますが、おそらく、後で分離できることをうれしく思います。

16
kub1x