2017-06-19 51 views
2

比方說,我有一個包含以下字段的用戶類型:GraphQL:如何跨服務器端查詢字段?

type User { 
    name: String 
    username: String 
    someOtherField1: String 
    someOtherField2: String 
    someOtherField3: String 
    someOtherField4: String 
    creditCardNumber: String 
} 

如果我查詢自己,沒關係返回所有領域,因爲這些信息是我的。因此,返回creditCardNumber到客戶端是沒有什麼大不了的。但是,如果我正在查詢其他人,我應該只能訪問返回的用戶的公共信息。返回creditCardNumber將是可怕的。即使我沒有在客戶端上編寫查詢代碼,也不會阻止惡意用戶挖掘代碼,將客戶端查詢更新爲包含creditCardNumber並執行它?

什麼是在GraphQL中跨查詢實現這種級別的字段限制的最佳方式?我對這個唯一的想法到目前爲止是創建一個單獨的UserSearch型,即

type UserSearch { 
    name: String 
    username: String 
    someOtherField1: String 
    someOtherField2: String 
    someOtherField3: String 
    someOtherField4: String 
} 

不包括私人領域,但是這並不覺得枯燥你會創造許多類型的在結構上90%相似形成彼此。

是否有一個更清晰的方式來實現這一點,它不會創建不必要的類型或重複的字段?

回答

3

默認情況下,GraphQL類型可能是類型,這意味着您可以將null返回到任何字段。

這意味着,在creditCardNumber字段的resolve函數中,您可以檢查當前用戶是否被抓取,如果是,則返回該數字。否則,你返回null。

要訪問「contexted」數據,如當前用戶,GraphQL讓你執行graphql功能時傳遞一個對象context

graphql(schema, query, rootValue, context) // <-- the last parameter 

而且你會在每場resolve函數簽名找到這個對象:

... 
resolve: (object, args, context) => { 
    // Third argument is your object 
}, 
.... 

所以,你可以做什麼,是通過當前登錄用戶的上下文:

graphql(schema, query, rootValue, { user: getCurrentLoggedUser() }) 

而在你User類型,creditCardNumber場解析函數內部:

creditCardNumber: { 
    ... 
    resolve: (user, args, context) => { 
    if (user.id === context.user.id) 
     return user.creditCardNumber; 

    return null; 
    }, 
    ... 
} 

如果使用graphql-express,上下文是默認的要求,and you can customize it

+0

非常感謝! –

+0

我不敢相信這必須在需要過濾的每個領域的解決方案中處理。 –