2017-06-13 37 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