Как сделать преобразователь вложенных мутаций с помощью nexus-prisma

У меня есть следующая модель данных:

type Job { 
    // ...
    example: String
    selections: [Selection!]
    // ...
}

type Selection { 
    ...
    question: String
    ...
}

Я определяю свой тип объекта так:

export const Job = prismaObjectType({
  name: 'Job',
  definition(t) {
    t.prismaFields([
      // ...
      'example',
      {
        name: 'selections',
      },
      // ...
    ])
  },
})

Я делаю свой резольвер следующим образом:

t.field('createJob', {
  type: 'Job',
  args: {
    // ...
    example: stringArg(),
    selections: stringArg(),
    // ...
  },
  resolve: (parent, {
    example,
    selections
  }, ctx) => {
    // The resolver where I do a ctx.prisma.createJob and connect/create with example
  },
})

Итак, теперь в распознавателе я могу получить выбор в виде строки json, а затем проанализировать ее и подключить/создать с заданием.

Мутация будет выглядеть так:

mutation {
  createJob(
    example: "bla"
    selections: "ESCAPED JSON HERE"
  ){
    id
  }
}

Мне было интересно, есть ли что-нибудь более элегантное, где я мог бы сделать что-то вроде:

mutation {
  createJob(
    example: "bla"
    selections: {
       question: "bla"
    }
  ){
    id
  }
}

или

mutation {
  createJob(
    example: "bla"
    selections(data: {
      // ...
    })
  ){
    id
  }
}

Я заметил, что с нексус-призма вы можете делать stringArg({list: true}), но на самом деле вы не можете делать объекты.

Мой главный вопрос заключается в том, какой самый элегантный способ выполнить вложенную мутацию или соединить все в одном.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
4
0
2 366
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать inputObjectType, как показано в документах:

export const SomeFieldInput = inputObjectType({
  name: "SomeFieldInput",
  definition(t) {
    t.string("name", { required: true });
    t.int("priority");
  },
});

Обязательно укажите тип как часть types, которую вы передаете makeSchema. Затем вы можете использовать его для определения аргумента, например

args: {
  input: arg({
    type: "SomeFieldInput", // name should match the name you provided
  }),
}

Теперь значение аргумента будет доступно вашему преобразователю как обычный объект JavaScript, а не как строка. Если вам нужен список входных объектов или вы хотите сделать требуемый аргумент, вы делаете это, используя те же варианты, который вы бы предоставили при использовании скаляра — list, nullable, description и т. д.

Вот полный пример:

const Query = queryType({
  definition(t) {
    t.field('someField', {
      type: 'String',
      nullable: true,
      args: {
        input: arg({
          type: "SomeFieldInput", // name should match the name you provided
        }),
      },
      resolve: (parent, { input }) => {
        return `You entered: ${input && input.name}`
      },
    })
  },
})

const SomeFieldInput = inputObjectType({
  name: "SomeFieldInput",
  definition(t) {
    t.string("name", { required: true });
  },
});

const schema = makeSchema({
  types: {Query, SomeFieldInput},
  outputs: {
    ...
  },
});

Затем запросите его как:

query {
  someField(
    input: {
       name: "Foo"
    }
  )
}

Или с помощью переменных:

query($input: SomeFieldInput) {
  someField(input: $input)
}

Кажется, это именно то, что мне нужно, я рассмотрю и, возможно, назначу награду, большое спасибо! Документация не очень ясна или это я?? Спасибо вам!!

Trufa 30.04.2019 12:29

Да, nexus довольно новый, и документации довольно мало. Однако они принимают PR для любых исправлений или дополнений к документам :)

Daniel Rearden 30.04.2019 13:29

FWIW я обновил ответ более полной примерной схемой.

Daniel Rearden 30.04.2019 13:30

Привет! Я никогда не проверял, так как я уже реализовал это другим способом, я получаю: Error: Expected SomeFieldInput to be a valid output type, saw GraphQLInputObjectType есть идеи? Спасибо! Извините за задержку с ответом!

Trufa 17.11.2019 20:45

Другие вопросы по теме