web-dev-qa-db-ja.com

GraphQL Argsエラー:引数タイプは入力タイプである必要がありますが、取得しました:function GraphQLObjectType(config){

サーバーの起動時(node index.js)GraphQLNodeJSサーバーで次のエラーが発生します。

エラー:Query.payment(data :)引数タイプは入力タイプである必要がありますが、取得しました:function GraphQLObjectType(config){_ classCallCheck(this、GraphQLObjectType);

このエラーは、元の引数を文字列から変更したときに発生しました

        args: {
            data: { type: graphQL.GraphQLString }
        },

オブジェクトタイプへ:

        args: {
            data: { type: graphQL.GraphQLObjectType }
        },

いくつかのフィールドをパラメータとして送信する必要があるため、オブジェクトタイプが必要です。

GraphQLサーバー:

var Query = new graphQL.GraphQLObjectType({
    name: 'Query',
    fields: {
        payment: {
            type: graphQL.GraphQLString,
            args: {
                data: { type: graphQL.GraphQLObjectType }
            },
            resolve: function (_, args) {
                // There will be more data here, 
                // but ultimately I want to return a string
                return 'success!';
            }
        }
    }
});

オブジェクトを受け入れるようにするにはどうすればよいですか?


フロントエンド(必要な場合。ただし、これを送信する前にエラーが発生しています):

var userQuery = encodeURIComponent('{ payment ( data: { user : "test" } )}');

$.get('http://localhost:4000/graphql?query=' + userQuery, function (res) {
       //stuff
});
12
Growler

Objectを引数として使用する場合は、GraphQLInputObjectTypeの代わりにGraphQLObjectTypeを使用する必要があります。また、GraphQLは厳密に型ベースであるため、汎用のGraphQLObjectTypeを引数型として使用してから動的に引数をクエリすることは許可されていないことに注意してください。この入力オブジェクトで可能なすべてのフィールドを明示的に定義する必要があります(必須のフィールドとそうでないフィールドを選択します)

このアプローチを使用してみてください:

// your arg input object
var inputType = new GraphQLInputObjectType({
    name: 'paymentInput',
    fields: {
        user: {
            type: new GraphQLNonNull(GraphQLString)
        },
        order: {
            type: GraphQLString
        },
        ...another fields
    }
});

var Query = new graphQL.GraphQLObjectType({
    name: 'Query',
    fields: {
        payment: {
            type: graphQL.GraphQLString,
            args: {
                data: { type: new GraphQLNonNull(inputType) }
            },
            resolve: function (_, args) {
                // There will be more data here,
                // but ultimately I want to return a string
                return 'success!';
            }
        }
    }
});
22
LordDave