2017-06-13 36 views
2

我已将自己的连接分离出来,并可以在我的根查询中使用它(当连接在类型中定义时它可以正常工作),但是在尝试使用它时通过导入到连接类型我刚刚回来:如何使用GraphQL中继连接修复循环依赖

Error: PageEdge.node field type must be Output Type but got: undefined

我可以得到在我的QueryType,但不是PageType的连接工作。我的模式大致如此。

QueryType { 
    pages: [PageType] 
} 

PageType { 
    _id: string 
    pages: [PageType] 
} 

下面是该项目的回购协议,其中graphql东西是一个链接(我只是把它示数,看看所有的代码提交): https://github.com/DaveyEdwards/myiworlds/tree/master/src/data

我已经查询类型和网页类型的字段的thunk而且(这似乎是解决大多数人的问题的解决方案),试图使一个thunk出接口:

interfaces:() => [nodeInterface] 

我认为这是一个任何人建立与用户和朋友的应用非常普遍的问题。

UserType: { 
    friends: [UserType] 
} 

我的网页类型:

import { nodeInterface } from '../nodeInterface'; 
import PageConnection from './connections/PageConnection'; 

const PageType = new ObjectType({ 
    name: 'Page', 
    description: 'Everything you see can be placed inside a page.', 
    fields:() => ({ 
    id: globalIdField('Page', page => page._id), 
    _id: { 
     type: new NonNull(ID), 
     description: 'A unique id used to instantly locate this page inside the database', 
    }, 
    pageEdge: { 
     type: PageConnection, 
     args: connectionArgs, 
     resolve: async (page, { args }, { loaders }) => { 
     if (page.pageEdge) { 
      const pageEdge = await loaders.pageLoader.loadMany(page.pageEdge); 
      const connection = connectionFromArray(pageEdge, args); 
      return connection; 
     } 
     }, 
    }, 
    }), 
    interfaces:() => [nodeInterface], 
}); 

export default PageType; 

我PageConnection:

import { connectionDefinitions } from 'graphql-relay'; 

import PageType from '../PageType'; 

const { connectionType: PageConnection } = connectionDefinitions({ 
    name: 'Page', 
    nodeType: PageType, 
}); 

export default PageConnection; 

我nodeInterface:

import { nodeDefinitions } from 'graphql-relay'; 
import { getNode, getNodeType } from './type-registry'; 

export const { nodeInterface, nodeField } = nodeDefinitions(getNode, getNodeType); 

我喜欢的类型的注册表:

import { fromGlobalId } from 'graphql-relay'; 
require('babel-polyfill'); 

const types = {}; 

export const registerType = (model, type, lookupFn) => { 
    types[type.name] = { model, type, lookupFn }; 
}; 

export const getNode = async (globalId) => { 
    const { type: typeName, id } = fromGlobalId(globalId); 
    console.log('getNode', globalId, typeName, id); 

    if (types[typeName]) { 
    const object1 = await types[typeName].lookupFn(id); 
    const Class = types[typeName].model; 
    // let result = Object.create(types[typeName].model, object1); 
    const result = new Class(object1); 
    console.log('getNode result', result); 
    return result; 
    } 
    return null; 
}; 

export const getNodeType = (obj) => { 
    const keys = Object.keys(types); 
    let ret = null; 
    keys.map((typeName) => { 
    if (obj instanceof types[typeName].model) { 
     ret = types[typeName].type; 
    } 
    return true; 
    }); 
    return ret; 
}; 

我的查询类型,其中进口连接工作

import { 
    GraphQLObjectType as ObjectType, 
    GraphQLList as List, 
    GraphQLString as StringType, 
} from 'graphql'; 
import { connectionArgs, connectionFromArray, connectionDefinitions } from 'graphql-relay'; 
import { nodeField } from '../nodeInterface'; 
import PageType from './PageType'; 
import { getPageList } from '../queries/googleDatastore/pageQueries'; 
import PageConnection from './connections/PageConnection'; 

const QueryType = new ObjectType({ 
    name: 'QueryType', 
    fields:() => ({ 
    pages: { 
     type: PageConnection, 
     args: connectionArgs, 
     resolve: async (obj, args) => { 
     const response = []; 
     try { 
      const pageEdge = await getPageList(); 
      const connection = connectionFromArray(pageEdge, args); 
      return connection; 
     } catch (err) { 
      console.log('pages err', err); 
     } 
     return response; 
     }, 
    }, 
    node: nodeField, 
    }), 
}); 

export default QueryType; 

资源这个问题我一直在试图让工作:

这个回购的部分是我正在实施的连接工作摆在首位国王 https://github.com/bondz/learn-graphql-relay/blob/47211fdec44ce4bb10f487bddfc7411e5690b894/src/types/projectConnection.js

Edge.node field type must be Output Type but got: undefined

https://github.com/graphql/graphql-js/issues/612

https://github.com/graphql/graphql-js/issues/373

https://gist.github.com/fbaiodias/77406c29ddf37fe46c3c

回答

4

PageType.js顶部只需卸下import PageConnection和使用运行时要求:

... 
pageEdge: { 
    type: require('./connections/PageConnection'), 
    args: connectionArgs, 
... 
+0

返回错误:Page.pageEdge字段类型必须是输出类型,但是会得到:[object Object]。 – Davey

+0

也尝试把要求内功能,并呼吁 类型:网页()和网页()[0/1]仍然没有什么 – Davey

+3

尝试'require('./connections/ PageConnection').'TIME' – RomanHotsiy