如何在JavaScript中使用字符串嵌套对象编写有效的GraphQL突变?

时间:2019-10-22 20:24:25

标签: javascript json graphql

我有一个用于音乐作品的GraphQL模式,该结构为作品中的每种乐器都提供了嵌套类型的数组。嵌套类型包括仪器名称和一个数据字段(定义为布尔数组)。

如何使用嵌套对象的变量在JS中编写变异?

下面是我使用硬编码为[{instrument: "Bass", data: [true, false]}]

的嵌套类型得到的结果

const obj = JSON.stringify([{instrument: "Bass", data: [true, false]}])

const query = `mutation {
  createComposition(
    compositionInput: {
      recording: ${obj}
    }
  ){
    shortid
  }
}`

const body = JSON.stringify({ query })

const options = {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body
}

fetch(url, options)
  .then(res => res.json())
  .then(res => {
    if (res.errors) console.log(res.errors)
    else console.log(res.data)
  })

此操作失败,显示为Syntax Error: Expected Name, found String "instrument"。这是请求的完整查询正文:

{"query":"mutation {\n      createComposition(\n        compositionInput: {\n          recording: [{\"instrument\":\"Bass\",\"data\":[true,false]}]\n        }\n      ){\n        shortid\n      }\n    }"}

双重字符串化似乎是导致嵌套对象属性上的引号引起来的问题,但我不知道该怎么做。

对原始对象使用字符串插值会使它变成旧的[object Object],如果我将对象直接硬编码到字符串中(绕过第一个stringify调用),它可以很好地工作,但是我希望对象是可变的。

我已经找到了解决方案How can I convert the object array to GraphQL format in Javascript?,但答案是将第一个stringify生成的双引号进行正则表达式处理。感觉就像是黑客。

似乎应该不难,如果可以的话,我想这将是一个普遍的问题。我会做这完全错误吗?有什么想法吗?

这是整个架构定义:

  type Composition {
    _id: ID!
    recording: [InstrumentRecording!]!
    created: String!
    modified: String!
    shortid: String!
  }

  input CompositionInput {
    recording: [InstrumentRecordingInput!]!
  }

  type InstrumentRecording {
    instrument: String!
    data: [Boolean!]!
  }

  input InstrumentRecordingInput {
    instrument: String!
    data: [Boolean!]!
  }

  type Query {
    compositions: [Composition!]!
  }

  type Mutation {
    createComposition(compositionInput: CompositionInput): Composition
  }

  schema {
    query: Query
    mutation: Mutation
  }

0 个答案:

没有答案