如何将对象传递给TypeScript 3.0中的突变

时间:2018-12-13 13:04:47

标签: typescript graphql

我有一个对象input,想将其传递给mutation

export enum RatingType {
  GENERAL = 'GENERAL',
  ADULT = 'ADULT',
}
const input = {
  id: '123456789',
  name: 'yourname',
  ratingType: RatingType.ADULT
}

如何像这样将input传递到mutation中:

mutation = `mutation updateUser{
  user: {
     id: "1234567890",
     name: "yourname",
     ratingType: ADULT,
  }
}` 

我尝试如下

import {request} from 'graphql-request';
const mutation = `mutation updateUser{
  user: {
     ${JSON.stringify(input)}
  }
}`
const response = await request('http://localhost:3002/graphql', mutation);

但是mutation无法识别:

"id"必须为id

"name"必须为name

"ratingType"必须为ratingType

'123456789'必须为"123456789"

'yourname'必须为"yourname"

'ADULT'必须为ADULT

请给我建议

谢谢。

1 个答案:

答案 0 :(得分:0)

首先,GraphQL不是JSON。因此,在此处使用JSON.stringify没有任何意义。 在GraphQL中,您可以将变量用作参数来解决问题。然后,您可以以JSON格式提供变量。

在不知道您正在使用什么库的情况下,我假设您与不带任何graphql库的graphql服务器进行通信。我假设您使用的是类似于fetch的东西。

我想您有类似UpdateUserInput之类的内容作为输入参数的graphql类型。 因此,要使用变量,您需要像下面这样重写您的突变:

mutation UpdateUser($input: UpdateUserInput) {
  updateUser(user: $user) {
    id
    name
  }
}

然后,您可以像这样提供变量:

input: JSON.stringify(input)

因此完整的fetch调用看起来像这样

const data = {
  query: `
    mutation ($input: UpdateUserInput) {
      updateUser(user: $user) {
        id
        name
      }
    }
  `,
  variables: {
    user: input
  }
};
fetch(url, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify(data),
});

但是,在不了解GraphQL客户端库的情况下,很难说出如何正确实现它。也许您想看看ApolloClient。

还请记住,我没有测试此代码,因此可能存在一些小错误。