2017-02-20 331 views
3

我無法讓GraphQL識別JSON標量類型。如何在GraphQl中使用graphql-type-json包

我跟着[阿波羅文檔](http://dev.apollodata.com/tools/graphql-tools/scalars.html#Using-a-package)來定義用於我的架構一JSON GraphQL標量類型:

架構:

const SchemaDefinition = ` 
    scalar JSON 
    schema { 
    query: Query 
    mutation: Mutation 
    } 
` 

export default [ 
    SchemaDefinition, 
    Query, 
    Mutation, 
    ... 
] 

測試類型:

const Test = ` 
    type Test { 
    bodyJson: JSON 
}` 

解析器:

import GraphQLJSON from 'graphql-type-json' 

const QueryResolver = { 
    Query: { 
    viewer(root, args, ctx) { 
     return User.query() 
     .where('id', ctx.state.user) 
     .first() 
    } 
    } 
} 

const scalarJSON = { 
    JSON: GraphQLJSON 
} 

export default { 
    ...QueryResolver, 
    ...ViewerResolver, 
    ...scalarJSON 
    ... 
} 

我使用的是PostgreSQL,我查詢的列(body_json)是數據類型jsonb。

如果我通過GraphiQL,考驗我的模式,當我從數據庫中(我用Knex查詢)我收到此錯誤消息GraphQL直接返回值:

期望類型的值\「JSON \」但收到:[對象的對象]

如果我使用JSON.stringify先上返回的值,我得到這個錯誤:

JSON \「預期類型\的價值」,「但收到:{\」鍵\「:\」test \「}」

任何關於我可能在做什麼的建議錯了嗎?

回答

0

我無法獲得使用基於文本模式的自定義標量(使用核心「graphql」庫中的buildSchema('...')),但是當我從頭開始以編程方式構建模式時(使用new GraphQLSchema(...)),它工作正常。

+0

好的,我會研究一下。謝謝。如果我有任何問題,我會在這裏更新。 – Telitos

1

我決定自定義標JSON像這樣的解析器

JSON: { 

__serialize(value) { 
    return GraphQLJSON.parseValue(value); 
} } 

和它的工作對我罰款。我認爲它會幫助你