如何从JS客户端将对象数组传递给graphql查询

时间:2019-05-03 11:11:30

标签: javascript graphql

我想传递给对象抛出graphql API的服务器数组。

我对架构的查询

export const schema = buildSchema(`
  type Query {
    statistics(
      modelId: String
      picksEnds: [PickEnd]        
    )
  }: Statistics
  type PickEnd {
    end: String
    limit: float
  } 
  ...
`)

我基于js的客户端查询:

 const createStatisticsQuery = (...) => {
     return `query {
             statistics(
               modelId: "${modelId}", 
               picksEnds: ${JSON.stringify(myEnds)}
             ) ...

但是从graphql中获取错误:

  

消息:“语法错误:预期名称,找到字符串“ end””

请求有效内容的片段:

  

{“ query”:“查询{\ n统计信息(\ n modelId:   \“ 5ca0f4afb88b3a2e006faa0d \”,\ n   结束时间:   [{\“ end \”:\“ home \”},{\“ end \”:\“ draw \”},{\“ end \”:\“ away \”},{\“ end \”: \“ under \”,\“ limit \”:0.5},{\“ end \”:\“ over \”,\“ limit \”:0.5},{\“ end \”:\“ under \”, \“极限\”:1.5 ...

1 个答案:

答案 0 :(得分:1)

虽然GraphQL语法类似于JSON,但是您不能通过调用JSON.stringify然后将结果插入模板字符串来在GraphQL文档中使用JSON。

GraphQL期望什么:

[{end:"foo",limit:2.0}]

使用stringify可以做什么:

[{"end":"foo","limit":2.0}]

由于该语法无效,因此将引发错误。解决此问题的最简单方法是利用变量来提供所需的输入,因为变量值以JSON的形式提供。

# Note: Replace PickEndInput with whatever your input type is actually called
query StatsQuery($id: String!, $ends: [PickEndInput!]!) {
  statistics(modelId: $id, picksEnds: $ends) {
    # ...
  }
}

然后,您可以为变量构造一个JavaScript对象,并将其传递给fetchaxios或任何用于发出请求的对象。例如:

const variables = {
  id: 'SOME_ID',
  ends: [
   {
     end:'foo',
     limit: 2.0,
   },
  ],
}
const query = ...
fetch('SOME_ENDPOINT_URL', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ variables, query }),
})

理想情况下,您希望使用Apollo之类的现有客户端来简化这些调用。