首页 文章

GraphQL Args错误:参数类型必须是输入类型但得到:函数GraphQLObjectType(config){

提问于
浏览
10

在服务器启动时( node index.js )我的GraphQL NodeJS服务器出现以下错误:

错误:Query.payment(data :)参数类型必须是输入类型但得到:函数GraphQLObjectType(config){_ classCallCheck(this,GraphQLObjectType);

当我从字符串中更改原始args时发生此错误

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

对象类型:

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

我需要一个对象类型,因为我需要发送几个字段作为参数 .

GraphQL Server:

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

我如何允许它接受一个对象?


Frontend (如果需要 . 但是在我发送之前错误发生了):

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

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

1 回答

  • 21

    如果要使用Object作为参数,则应使用 GraphQLInputObjectType 而不是 GraphQLObjectType . 请记住,GraphQL是基于强类型的,因此不允许使用泛型 GraphQLObjectType 作为arg类型,然后动态查询args . 您必须在此输入对象中显式定义所有可能的字段(并选择哪些字段是强制的,哪些不是)

    尝试使用这种方法:

    // 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!';
                }
            }
        }
    });
    

相关问题