2017-09-01 9 views
0

GraphQLの循環定義を解決する必要がありますが、何らかの理由で解決できません。 I'veはサンクと遅延読み込みに関するいくつかの記事をチェックして、ここに私の現在のコードです:Thunkを使用したGraphQL循環参照 - エラー:フィールドタイプは出力タイプである必要がありますが、未定義です

歴史/ types.js

const fields = { 
    id: { 
     type: new GraphQLNonNull(GraphQLID), 
     resolve: (obj) => dbIdToNodeId(obj._id, "History") 
    }, 
    timestamp: { 
     type: GraphQLLong 
    }, 
    objectId: { 
     type: GraphQLString 
    }, 
    user: { 
     type: require('../User/connections').default, 
     args: connectionArgs, 
     resolve: (source, args) => { 
      return UserModel.findOne({ id: source.id }).exec(); 
     } 
    }, 
    action: { 
     type: new GraphQLNonNull(GraphQLString) 
    } 
}; 

export const HistoryType = new GraphQLObjectType({ 
    name: 'History', 
    description: 'History', 
    interfaces:() => [NodeInterface], 
    isTypeOf: (value) => value instanceof HistoryModel, 
    fields:() => (fields) 
}); 

歴史/ connections.js:

import { HistoryType } from './types'; 
const { connectionType: HistoryConnectionType } = connectionDefinitions({ nodeType: HistoryType }); 

export default HistoryConnectionType; 

ユーザー/ types.js

const fields = { 
    id: { 
     type: new GraphQLNonNull(GraphQLID), 
     resolve: (obj) => dbIdToNodeId(obj._id, "User") 
    }, 
    email: { 
     type: GraphQLString 
    }, 
    history: { 
     type: require('../History/connections').default, 
     args: connectionArgs, 
     resolve: (source, args, context) => { 
      return HistoryModel.find({ deleted: false, objectId: source.id}).sort('timestamp').exec(); 
     } 
    } 
}; 

export const UserType = new GraphQLObjectType({ 
    name: 'User', 
    description: 'User', 
    interfaces:() => [NodeInterface], 
    isTypeOf: (value) => value instanceof UserModel, 
    fields:() => (fields) 
}); 

ユーザー/ connections.js

import { UserType } from './types'; 

const { connectionType: UserConnectionType } = connectionDefinitions({ nodeType: UserType }); 

export default UserConnectionType; 

会社/ types.js

const fields = { 
    id: { 
     type: new GraphQLNonNull(GraphQLID), 
     resolve: (obj) => dbIdToNodeId(obj._id, "Company") 
    }, 
    name: { 
     type: GraphQLString 
    }, 
    users: { 
     type: require('../User/connections').default, 
     args: connectionArgs, 
     resolve: (source, args) => { 
      const { id } = source; 
      return UserModel.find({ companyId: id }).then((rows) => connectionFromArray(rows,args)); 
     } 
    }, 
    history: { 
     type: require('../History/connections').default, 
     args: connectionArgs, 
     resolve(source, args, context) { 
      return loaders.getHistory(source.id); 
     } 
    } 
}; 

export const CompanyType = new GraphQLObjectType({ 
    name: 'Company', 
    description: 'Company', 
    interfaces:() => [NodeInterface], 
    isTypeOf: (value) => value instanceof CompanyModel, 
    fields:() => (fields) 
}); 

会社/ connections.js

import { CompanyType } from './types'; 

const { connectionType: CompanyConnectionType } = connectionDefinitions({ nodeType: CompanyType }); 

export default CompanyConnectionType; 

私はcan'tそれを機能させる。実行しているとき私は次の出力を得る:

History.user field type must be Output Type but got: undefined 

私はそれを解決するために感謝します。

+0

これが役に立つかもしれませんhttps://stackoverflow.com/questions/42498900/graphql-error-undefined-adding-a-relationship/42500391#42500391 –

答えて

1

私はあなたが今ではそれを解決すると思いますが、渡し誰のために:history/types.js
fieldsオブジェクトはHistoryTypefields機能にインライン化されなければならないので、それは実行時に作成されます。

const HistoryType = new GraphQLObjectType({ 
    ... 
    fields:() => ({ ... }), // not a var, object is inlined 
    ... 
}); 
関連する問題