我有一个用于音乐作品的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
}