Как разрешить мутации GraphQl, которые имеют массив в качестве входных данных - PullRequest
2 голосов
/ 27 января 2020

Итак, я новичок в GraphQL, и я пытаюсь разрешить мутацию с типом ввода массива. Я получаю эту ошибку

{
  "data": {
    "createSub": null
  },
  "errors": [
    {
      "message": "Variable '$data' expected value of type 'SubCreateInput!' but got: {\"apps\":[{\"name\":\"ma\",\"package\":\"me\",\"running\":true,\"isSysytem\":true}]}. Reason: 'apps' Expected 'AppListCreateManyInput', found not an object. (line 1, column 11):\nmutation ($data: SubCreateInput!) {\n          ^",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createSub"
      ]
    }
  ]
}

Это моя схема

type Mutation {
    createSub(input:subInput): Sub  
  }

input subInput{

    apps: [AppListInput]
}

type Sub{
    id: ID!
    apps: [AppList]  
  }


type AppList {
    id: ID!
    name: String
    package: String
    running: Boolean
    isSysytem: Boolean

}

input AppListInput {
    name: String
    package: String
    running: Boolean
    isSysytem: Boolean

  }

И это мой распознаватель

function createSub(root, args, context) {
    return context.prisma.createSub({
      apps: args.input.apps
    })
  }

Мутация / полезная нагрузка отправляется на Graphql игровая площадка это

mutation{
    createSub( input:{
      apps: [{
        name: "ma"
        package: "me"
        running: true
        isSysytem: true

      }],
    })
  {
    apps{
      name
    }
  }
  }

Когда я console.log (args.input.apps) Я получаю это

[ [Object: null prototype] { name: 'ma', package: 'me', running: true, isSysytem: true } ]

Это вход AppListCreateManyInput , сгенерированный в схеме

input AppListCreateManyInput {
  create: [AppListCreateInput!]
  connect: [AppListWhereUniqueInput!]
}

Чего мне не хватает, пожалуйста?

1 Ответ

3 голосов
/ 27 января 2020

Вам необходимо предоставить соответствующий объект для createSub, как показано здесь . Поскольку apps является отношением, вы не можете просто передать массив apps в - в конце концов, при создании Sub вы можете захотеть создать новые приложения и связать их с недавно созданным Sub, или просто связать с ним существующие приложения.

return context.prisma.createSub({
  apps: {
    create: args.input.apps, // create takes an array of apps to create
  }
})

Если вы хотите подключить существующие приложения вместо создания новых, вы должны использовать connect вместо create и передавать объект, определяющий условие where вместо массива.

...