У меня есть следующая модель данных:
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}), но на самом деле вы не можете делать объекты.
Мой главный вопрос заключается в том, какой самый элегантный способ выполнить вложенную мутацию или соединить все в одном.


Вы можете использовать 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)
}
Да, nexus довольно новый, и документации довольно мало. Однако они принимают PR для любых исправлений или дополнений к документам :)
FWIW я обновил ответ более полной примерной схемой.
Привет! Я никогда не проверял, так как я уже реализовал это другим способом, я получаю: Error: Expected SomeFieldInput to be a valid output type, saw GraphQLInputObjectType есть идеи? Спасибо! Извините за задержку с ответом!
Кажется, это именно то, что мне нужно, я рассмотрю и, возможно, назначу награду, большое спасибо! Документация не очень ясна или это я?? Спасибо вам!!