2017-09-01 58 views
0

我必須解決GraphQL的循環定義,但由於某種原因,我無法解決。從來就覈對了帖子有關的thunk和延遲加載,這裏是我當前的代碼:GraphQL循環引用使用thunk - 錯誤:字段類型必須是輸出類型,但得到:undefined

歷史/ 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; 

User/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; 

我不能讓它起作用。當運行我得到以下輸出:

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 
    ... 
}); 
相關問題