簡體   English   中英

Apollo Server:將參數傳遞給嵌套解析器

[英]Apollo Server: pass arguments to nested resolvers

我的 GraphQL 查詢如下所示:

{
    p1: property(someArgs: "some_value") {
        id
        nestedField {
            id
            moreNestedField {
                id
            }
        }
    }
}

在服務器端,我使用 Apollo Server。 我有一個用於property的解析器和其他用於nestedFieldmoreNestedField解析器。 我需要在嵌套解析器上檢索someArgs的值。 我嘗試使用解析器上可用的context來執行此操作:

property: (_, {someArgs}, ctx) => {
    ctx.someArgs = someArgs;

    // Do something
}

但這不起作用,因為上下文在所有解析器之間共享,因此如果我的查詢有多個property ,則上下文值不會很好。

我還嘗試使用我的嵌套解析器上的info可用的path 我可以進入property領域,但我沒有這里的論點......

我還嘗試添加一些關於info數據,但它沒有在嵌套解析器上共享。

在所有解析器上添加參數不是一種選擇,因為它會使查詢變得非常臃腫且編寫起來很麻煩,我不希望那樣。

有什么想法嗎?

謝謝!

可以使用當前返回的值將參數傳遞給子解析器。 稍后將從響應中刪除其他數據。

我將“借用”丹尼爾的代碼,但沒有特定的參數 - 將參數作為參考傳遞(適合/更干凈/對於更多參數更易讀):

function propertyResolver (parent, args) {
  const property = await getProperty()
  property.propertyArgs = args
  return property
}

// if this level args required in deeper resolvers
function nestedPropertyResolver (parent, args) {
  const nestedProperty = await getNestedProperty()
  nestedProperty.propertyArgs = parent.propertyArgs
  nestedProperty.nestedPropertyArgs = args
  return nestedProperty
}

function moreNestedPropertyResolver (parent) {
  // do something with parent.propertyArgs.someArgs
}

正如丹尼爾斯所說,這種方法的功能有限。 您可以chain結果並在子解析器中有條件地做一些事情。 您將擁有父級和過濾后的子級...使用子條件未過濾的父級(例如在 SQL ... WHERE ... AND ... AND ... 連接表上),這可以在父解析器中完成。

請在此處查看有關如何傳遞參數的答案: https : //stackoverflow.com/a/63300135/11497165

為了簡化它,您可以使用 args 定義您的字段類型:

在您的類型定義中

type Query{
  getCar(color: String): Car
  ... other queries
}

type Car{
  door(color: String): Door // <-- added args
  id: ID
  previousOwner(offset: Int, limit: Int): Owner // <-- added args
  ...
}

然后,在您的客戶端查詢中(來自 apollo 客戶端或您的 gql 查詢):

query getCar(carId:'123'){
  door(color:'grey') // <-- add variable
  id
  previousOwner(offset: 3) // <-- added variable
  ... other queries
}

您應該能夠在您的子解析器參數中訪問顏色:

在您的解析器中:

Car{
  door(root,args,context){
   const color = args.color // <-- access your arguments here
  }
  previousOwner(root,args,context){
   const offset = args.offset // <-- access your arguments here
   const limit = args.limit // <-- access your arguments here
  }
  ...others
}

對於您的示例:

會是這樣

{
    p1: property(someArgs: "some_value") { // <-- added variable
        id
        nestedField(someArgs: "some_value") { // <-- added variable
            id
            moreNestedField(offset: 5) {
                id
            }
        }
    }
}

您可以像這樣通過父字段傳遞值:

function propertyResolver (parent, { someArgs }) {
  const property = await getProperty()
  property.someArgs = someArgs
  return property
}

function nestedPropertyResolver ({ someArgs }) {
  const nestedProperty = await getNestedProperty()
  nestedProperty.someArgs = someArgs
  return nestedProperty
}

function moreNestedPropertyResolver ({ someArgs }) {
  // do something with someArgs
}

請注意,這是否有效,它也可能首先指出您的架構設計存在潛在問題。 根據您解析這些字段的方式(從數據庫中獲取它們、向另一個 API 發出請求等),最好采用完全不同的方法——例如,通過在根解析器中預先加載所有內容。 但是,如果沒有更多上下文,就很難提出任何其他建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM