如何在没有循环依赖关系的情况下拆分GraphQL中的模式?

时间:2016-08-18 01:43:22

标签: javascript graphql

我的问题与Javascript circular dependency in GraphQL code类似,但问题不在于结构和数据库级别,而在于javascript(ES6)。

我的架构定义越来越大,但我没有看到我可以将文件分割成碎片。基于不同的对象类型进行剪切似乎是合乎逻辑的,但这会带来循环依赖性,类似于这个非常简化的非工作示例:

{1, 6, 3, 2, 9}

对此有共同的方式或最佳做法吗?

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。我认为更清洁的解决方案是关于使用gruntjs concat。

grunt.initConfig({
  concat: {
    js: {
      src: ['lib/before.js', 'lib/*', 'lib/after.js'],
      dest: 'schema.js',
    }
  }
});

使用此配置,您可以将模式拆分为多个文件,从而创建最终的schema.js。

before.js可能就是这样:

 import {
    GraphQLObjectType,
    GraphQLInt,
    GraphQLString,
    GraphQLSchema,
    GraphQLList,
    GraphQLNonNull
} from 'graphql';
import db from '../models/index.js';
import Auth from '../classes/auth';

after.js可能是这样的:

const Schema = new GraphQLSchema({
    query: Query,
    mutation: Mutation
})
export default Schema;

其他文件将包含以下对象:

const Funcionario = new GraphQLObjectType({
name: 'Funcionario',
description: 'This represent a Funcionario',
fields: () => {
    return {
        id: {
            type: GraphQLInt,
            resolve(funcionario, args) {
                return funcionario.id;
            }
        },
        CPF: {
            type: GraphQLString,
            resolve(funcionario, args) {
                return funcionario.CPF;
            }
        },
        nome: {
            type: GraphQLString,
            resolve(funcionario, args) {
                return funcionario.nome;
            }
        },
        sobrenome: {
            type: GraphQLString,
            resolve(funcionario, args) {
                return funcionario.sobrenome;
            }
        },
        sessions: {
            type: new GraphQLList(Session),
            resolve(funcionario, args) {
                return funcionario.getSessions();
            }
        }
    }
}
})

答案 1 :(得分:0)

请参见https://github.com/francoisa/todo/tree/master/server/graphql/types

todoType.js有一个对viewerType的引用,该引用是在viewerType.js中定义的。

viewerType.js从todoType导入