【问题标题】:Type circular reference issue graphql类型循环引用问题 graphql
【发布时间】:2017-07-13 09:56:21
【问题描述】:

我有两个资源:PurchaseCategory,其中购买属于一个类别,类别有很多购买。我正在尝试允许查询,例如:

query {
    purchases {
        description,
        amount,
        category {
            name
        }
    }
}

query {
    categories {
        name,
        purchases {
            description,
            amount
        }
    }
}

在设置我的类型时,我收到以下错误:

Schema must contain unique named types but contains multiple types named "Category".

我很确定这是一个循环引用问题,但我已经使用了 thunk,因为我看到了其他答案的建议:

// Category/type.js
const {GraphQLObjectType, GraphQLInt, GraphQLString, GraphQLList} = require('graphql/type');
const {purchaseType} = require('../Purchase');

const categoryType = new GraphQLObjectType({
    name: 'Category',
    description: 'a purchasing category',
    fields: () => ({
        id: {
            type: GraphQLInt
        },
        name: {
            type: GraphQLString
        },
        purchases: {
            type: new GraphQLList(purchaseType),
            resolve (category) {
                return category.getPurchases();
            }
        }
    })
});

module.exports = categoryType; 

// Category/index.js
const categoryType = require('./type');
const categoryQuery = require('./query');

module.exports = {
    categoryType,
    categoryQuery
};

// Purchase/type.js
const {GraphQLObjectType, GraphQLInt, GraphQLString, GraphQLFloat} = require('graphql/type');
const {categoryType} = require('../Category');

const purchaseType = new GraphQLObjectType({
    name: 'Purchase',
    description: 'a specific purchase',
    fields: () => ({
        id: {
            type: GraphQLInt,
        },
        description: {
            type: GraphQLString,
        },
        amount: {
            type: GraphQLFloat,
        },
        category: {
            type: categoryType,
            resolve (purchase) {
                return purchase.getCategory();
            }
        }
    })
});

module.exports = purchaseType;

// Purchase/index.js
const purchaseType = require('./type');
const purchaseQuery = require('./query');

module.exports = {
    purchaseType,
    purchaseQuery
};

我是不是在这里搞砸了,或者我试图做的事情是不可能的?

编辑#1 是什么让我相信这是一个循环引用问题,如果我将 purchaseType 上的字段 category 更改为以下内容:

category: {
        // type: categoryType,
        // resolve (purchase) {
        //     return purchase.getCategory();
        // }
        type: GraphQLInt,
        resolve (purchase) {
            return 10;
        }
    }

并执行类似于categoryType purchases 字段的操作,它可以正常工作。

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    Schema must contain unique named types but contains multiple types named "Category".

    这个错误很明显,表示你声明的各个GraphQLObjectType多次包含名称Category,请检查你所有GraphQLObjectType的名称,并更改它,不应该相同或请更新问题中的所有Type

    注意:GraphQLType 的所有名称必须唯一,不能相互匹配

    const categoryType = new GraphQLObjectType({
        name: 'Category', -------> others GraphQLObjectType may have same name Category
        description: 'a purchasing category',
        fields: () => ({
             .....
        })
    });
    

    【讨论】:

    • 我检查了我所有的类型,我只有一次category。我用我尝试过的东西更新了我的问题。
    【解决方案2】:

    我的问题最终变成了大写问题。

    在我的schema.js 我正在做:

    const {purchaseType, purchaseQuery} = require('./resources/purchase/');
    

    Category/type.js我正在做:

    const {purchaseType} = require('../Purchase');
    

    Node 以区分大小写的方式缓存模块,因此它加载了两次 purchaseTyp 模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多