如何在GraphQl中使用graphql-type-json包

时间:2017-02-20 19:54:27

标签: node.js postgresql graphql

我无法让GraphQL识别JSON标量类型。

我按照[apollo docs](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测试我的模式,当我直接从db返回值时(我使用Knex进行查询),我从GraphQL中收到此错误消息:

期望值类型为“JSON”但收到:[object Object]

如果我首先在返回的值上使用JSON.stringify,我会收到此错误:

“预期类型为”JSON“的值,但收到:{\”key \“:\”test \“}”

有关我可能做错的任何建议吗?

2 个答案:

答案 0 :(得分:2)

我在解析器

中解决了这样的自定义标量JSON
 JSON: {

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

它对我来说很好。我认为它会对你有所帮助

答案 1 :(得分:0)

我无法使用基于文本的模式使用自定义标量(使用核心“graphql”库中的buildSchema('...')),但是当我从头开始以编程方式构建模式时使用{{1 }})。