2016-09-21 84 views
1

我正在瀏覽GraphQl的文檔,並意識到新的Schema Langugage僅支持默認解析器。有什麼方法可以在使用新的模式語言時添加自定義解析器?如何以GraphQL模式語言返回嵌套對象

let userObj = { 
 
    id: 1, 
 
    name: "A", 
 
    homeAddress: { 
 
    line1: "Line1", 
 
    line2: "Line2", 
 
    city: "City" 
 
    } 
 
}; 
 

 
let schema = buildSchema(` 
 
    type Query { 
 
    user(id: ID): User 
 
    } 
 

 
    type User { 
 
    id: ID 
 
    name: String 
 
    address: String 
 
    } 
 
`); 
 

 
//I would like User.address to be resolved from the fields in the json response eg. address = Line1, Line2, City

這是我所定義的架構。我想在這裏添加一些行爲,這將允許我解析地址對象並返回連接的字符串值。

回答

0

看起來你在這裏有一個困惑,因爲你定義的地址是字符串,但你發送一個字典來解決它。

你可以做的是定義一個標量地址類型: scalar AddressType如果你使用buildSchema然後附加解析函數給它。 (或使用graphql-tools輕鬆地做到這一點)

或從頭開始建造類型一樣顯示在the official documentations

var OddType = new GraphQLScalarType({ 
    name: 'Odd', 
    serialize: oddValue, 
    parseValue: oddValue, 
    parseLiteral(ast) { 
    if (ast.kind === Kind.INT) { 
     return oddValue(parseInt(ast.value, 10)); 
    } 
    return null; 
    } 
}); 

function oddValue(value) { 
    return value % 2 === 1 ? value : null; 
} 

,然後你可以分析辭典成字符串(parseValue)否則

+0

道歉。我通過將對象中的'地址'字段重命名爲'homeAddress'來更新問題。所以我想把這個對象解析成一個字符串。我的問題是更多的圍繞如何使用新的模式語言 – achakravarty

+0

來實現,新的buildSchema仍然需要將解析器附加到模式中,它將定義骨架,但仍然需要知道如何解析/解析/解析字段 – HagaiCo

+0

是的,我知道。只是想知道是否有辦法實現使用新的buildSchema。我喜歡新的語法,因爲它看起來更乾淨。 – achakravarty

2

正如HagaiCo和github issue所提到的,正確的方法是使用graphql-tools

它有一個叫做makeExecutableSchema功能,這需要一個架構和解決功能,然後返回一個可執行的架構