Возврат типа Appsync GraphQL, в котором также есть преобразователи полей - PullRequest
0 голосов
/ 29 августа 2018

Я хотел бы вернуть тип ImageSet из мутации AddImageSet. Но мне кажется, что я не могу этого сделать, потому что каждое поле в моем типе ImageSet имеет свой собственный преобразователь, который перезаписывает шаблон сопоставления преобразователя.

Схема:

type ImageSet {
    SetKey: ID
    SetName: String
    SetCreatedAt: AWSTimestamp
    SetDescription: String
    SetTags: [Tag]
}

type Mutation {
    AddImageSet(setName: String!, setDescription: String): ImageSet
}

Вот мутация:

{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "PartitionKey" : { "S" : "ImageSet" },
        "SortKey" : { "S" : "ImageSet-$util.autoId()" }
    },
    "attributeValues" : {
        "Name": { "S" : "${context.arguments.setName}" },
        "Description": { "S" : "${context.arguments.setDescription}" },
        "CreatedAt": { "N" : $util.time.nowEpochSeconds() },
    }
}

и шаблон отображения ответов

{
    "SetKey" : "$context.result.SortKey",
    "SetName" : "$context.result.Name",
    "SetCreatedAt" : $context.result.CreatedAt,
    "SetDescription" : "$context.result.Description"
}

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

Я решил эту проблему, создав дубликат типа 'ImageSetResult', без привязчиков к полю. Затем, если мутация AddImageSet возвращает это, все просто отлично. Но это кажется излишним.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 29 августа 2018

Это ожидаемое поведение в GraphQL. Если у вас есть определитель ImageSet.SetKey и ваша мутация Mutation.AddImageSet возвращает объект типа ImageSet , преобразователь каждого поля, указанного в наборе выбора будет вызван. Значения, возвращаемые Mutation.AddImageSet , будут перезаписаны любыми значениями, возвращаемыми дочерними распознавателями.

Чтобы добавить больше контекста, значение, которое вы возвращаете из шаблона ответа Mutation.AddImageSet , будет равно $ ctx.source , когда вы находитесь в ImageSet.SetKey / SetName / SetCreatedAt распознаватели. Из этих преобразователей вы можете сделать что-то вроде этого:

#if( $ctx.source.SetKey ) "$ctx.source.SetKey" #else .. whatever SetKey does .. #end

Есть ли причина, по которой вам нужны преобразователи для SetKey / SetName / etc? Если объект уже возвращается Mutation.AddImageSet или Query.AddImageSet и т. Д., Вам не нужны средства распознавания для этого типа.

Еще одна заметка. Есть ли причина, по которой вам нужны имена ImageSet.SetName вместо просто ImageSet.Name , как вы храните их в DynamoDB? Это, кажется, добавляет много сложности, где вы, вероятно, можете избежать этого.

...