2017-03-27 76 views
0

我很難找出石墨烯Django應該與react-router-relay一起使用的方式。比方說,我可以在我的Django的服務器上通過GraphiQL控制檯使用以下GraphQL查詢精:石墨烯Django和反應路由器繼電器

query { 
    allThreads { 
    edges { 
     node { 
     id 
     } 
    } 
    } 
} 

這大概是石墨烯的替代品使用,因爲繼電器不支持根查詢連接的commmon viewer包裝。所以我明白allThreads實際上是一個節點(類型爲ThreadNodeConnection),並且有一個可以查詢的邊連接。

麻煩是我無法弄清楚如何使用這個繼電器,特別是react-router-relay。我上有一個片段是這樣的(其他地方一個子線程組件)一個陣營的觀點:

fragments: { 
     store:() => Relay.QL` 
     fragment on Query { 
      allThreads (first:300) { 
      edges { 
       node { 
       // child's fragment included here 
       } 
      }, 
      } 
     } 
     `, 
    }, 

的WebPack檢查這對我的生活模式和喜歡它。然後,我創建我的index.js以下的路由器:

const ViewerQueries = { 
    store:() => Relay.QL`query { allThreads(first:300) }` 
}; 

ReactDOM.render(
    <Router 
    forceFetch 
    environment={Relay.Store} 
    render={applyRouterMiddleware(useRelay)} 
    history={browserHistory} 
    > 
    <Route path='/' component={ThreadList} queries={ViewerQueries} /> 
    </Router> 
    , document.getElementById('container') 
) 

已經我感覺有點不確定,因爲我想我在做ViewerQueries錯,但很難知道,因爲每個人都使用它來適應他們的viewer封裝在他們的GraphQL連接上,但Graphene在每個連接上有不同的包裝,所以這可能只適用於我的單一路由,但現在沒關係。 Webpack再次贊同它的模式。但是,當我加載頁面時,我得到一個「錯誤的請求」和錯誤:

「片段F1不能在這裏廣泛傳播, 型ThreadNodeConnection的對象永遠不能查詢類型」

說實話,這就是我無法繼續下去的地方,因爲我顯然不瞭解Graphene Django如何構造模式,或者應該如何編寫GraphQL片段,或者如何編寫Route查詢。麻煩的是,我無法弄清楚哪些是錯誤的,在使用這些特定技術組合的人身上似乎沒有任何資源。

爲了完整起見,我的石墨烯Django的架構設置是(略有簡化):

項目/線程/ schema.py:

class ThreadNode(DjangoObjectType): 
    class Meta: 
     model = Thread 
     interfaces = (relay.Node,) 

... 

class Query(graphene.AbstractType): 
    all_threads = DjangoFilterConnectionField(ThreadNode) 
    thread = relay.Node.Field(ThreadNode, id=graphene.Int()) 

    def resolve_all_threads(self, args, context, info): 
     return Thread.objects.select_related('author__profile').all() 

    def resolve_thread(self, args, context, info): 
     id = args.get('id') 

     if id is not None: 
      return Thread.objects.get(pk=id) 

     return None 

項目/ schema.py:

class Query(project.threads.schema.Query, graphene.ObjectType): 
    pass 

schema = graphene.Schema(query=Query) 

如果有人曾經使用過這種特殊的組合,並有任何建議,那將是驚人的。

+0

這不是關於石墨烯。你所要做的就是使用連接字段作爲根字段。這在Relay 1中不被支持,但應該在Relay 2中。完整的解釋在這裏:https://github.com/facebook/relay/issues/112 –

+0

我不認爲這是真的,我在這個問題中提到。石墨烯通過環繞所有連接避開了連接問題,因此連接變成了一個具有可用邊連接的節點。 –

+0

我注意到查詢中的「fragment」行。您是否嘗試過使用ThreadNodeConnection的片段? –

回答

0

我有這個同樣的問題,經過長時間的搜尋後,我終於找到了這個答案 https://github.com/facebook/relay/issues/1558#issuecomment-297010663

由於繼電器1不支持以root身份查詢連接。您應該將查看器作爲節點界面來打包查詢。 所以在你的服務器主查詢(項目/模式。PY)您應添加以下代碼:

class Query(project.threads.schema.Query, graphene.ObjectType): 
    viewer = graphene.Field(lambda: Query) 
    id = graphene.ID(required=True) 

    def resolve_viewer(self, args, context, info): 
    return info.parent_type 

    def resolve_id(self, args, context, info): 
     return 1 

    class Meta: 
     interfaces = (graphene.relay.Node,) 

現在你graphiql可以格式化你的查詢是這樣的:

query { 
    viewer{ 
    allThreads(first:10) { 
    edges { 
     node { 
     id 
     } 
    } 
    } 
} 
} 

在客戶端,你可以創建你的容器是這樣的:

export default Relay.createContainer(ThreadList, { 
    fragments: { 
     viewer:() => Relay.QL` 
    fragment on Query { 
      id 
      allThreads(first:10){ 
      edges{ 
       node{ 
       id 
       } 
      } 
      } 
     } 
    `, 
    }, 
}); 

我希望這可以幫助你