簡體   English   中英

如何在GraphQL中解析嵌套類型?

[英]How to resolve nested types in GraphQL?

我在解析graphql嵌套類型時遇到問題。 我可以成功獲取UserMetrics嵌套解析器,但父解析器對象(用戶)為null。 我誤解了GraphQL解析器映射嗎?

架構:

type User {
    id: String!
    metrics: UserMetrics
}

type UserMetrics {
    lastLogin: String!
}

解析器:

Query: {
    user(_, { id }, ctx) {
        return { id }; 
    }
},

User: {
    metrics(): ({}), // UserMetrics.lastLogin doesn't fire without this
},

UserMetrics: {
    lastLogin(user) {
        console.log(user); // null
    }
},

這可能有點讓人困惑,不幸的是,文檔沒有提供嵌套類型如何工作的可靠示例。 根據文檔,解析器采用的第一個參數是:

包含從父字段上的解析程序返回的結果的對象

因此,父(用戶)解析某個字段(指標)。 如果此字段是標量,則不需要執行任何其他操作,這就是返回的內容。 否則 ,父解析的值將傳遞給與“子”類型(UserMetrics)關聯的解析器。 然后,每個解析器都使用該值來解析它負責的字段。

在您提供的代碼中, Usermetrics解析為空對象(即{})。 這是為UserMetrics中的任何字段傳遞給解析程序的值。 嚴格地說,在這種情況下,在該值上運行console.log將返回{},而不是null。

試試這個:為metrics字段注釋掉你的解析器,而不是{ id } ,讓你的查詢返回{ id, metrics: { lastLogin: 'foo' }} 運行它,您應該看到一個控制台輸出,顯示傳遞給lastLogin的解析器的lastLogin ,在本例中為{ lastLogin: 'foo' }

一步一步,這里發生了什么:

  1. 查詢的user字段正在解析為{id:'whateverIdYouProvided',metrics:{lastLogin:'foo'}}。 由於它返回的是User類型而不是標量,因此它會將此值傳遞給User內任何字段的解析器。
  2. id這樣的字段在這種情況下沒有指定解析器,所以它使用默認的解析器 這只是查看它收到的對象,如果找到與其字段名稱匹配的屬性,它將解析為該屬性的值。 如果它找不到該名稱的任何屬性,則返回null。 在這種情況下,id是一個標量,所以它只是解析為'whateverIdYouProvided'並且不需要再進一步了。
  3. 因為我們注釋了metrics解析器,所以此字段也將使用默認解析器。 在這種情況下,它解析為一個類型(UserMetrics),因此它查看給定的對象,找到一個名為metrics的屬性,並將該值(即{ lastLogin: 'foo' } )傳遞給UserMetrics中字段的任何解析器。
  4. UserMetrics有一個名為lastLogin的字段。 它的解析器收到上述值 - { lastLogin: 'foo' } - 可以使用。 如果你沒有在這里指定一個解析器,那么將再次使用默認的解析器,它將很樂意找到一個名為lastLogin的屬性並解析它的值('foo')。 如果您提供自定義解析器,就像您所做的那樣,顯然它將解析為您返回的任何內容(在您的代碼的情況下為null)。

如果lastLogin沒有調用lastLogin解析器,請驗證您是否在查詢中實際包含了該字段! 不包含在查詢中的任何字段都不需要解析,因此不會調用它們的解析器。

暫無
暫無

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

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