Как получить доступ к аргументам дочернего преобразователя из родительского вызова в AWS Appsync

У меня есть два типа: Todo и Комментарий.

type Todo {
    id: ID!
    name: String
    description: String
    priority: Int
    status: TodoStatus
    comments: [Comment]
}
type Comment {
    todoid: ID!
    commentid: String!
    content: String
}

Затем у меня есть запрос getTodo, но я хочу включить аргумент содержимого, который фильтрует комментарий (дочерний элемент), если переданная строка находится в содержимом комментария.

getTodo(id: ID!, content: String!): Todo

Я пробовал прикрепить резолвер к комментариям (в Todo). Если я добавлю сюда фильтр, как я смогу получить ctx.args.content, который был передан в getTodo (id: ID !, content: String!).

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        ## Provide a query expression. **
        "expression": "todoid = :id",
        "expressionValues" : {
            ":id" : {
                "S" : "${ctx.args.id}"
            }
        }
    },
    "filter": {
        "expression": "contains(content, :content)",
        "expressionValues" : {
            ":content": {
                "S": "${ctx.args.content}"
            }
        }
    }
}

Или, если я удалю этот фильтр и оставлю его так:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        ## Provide a query expression. **
        "expression": "todoid = :id",
        "expressionValues" : {
            ":id" : {
                "S" : "${ctx.args.id}"
            }
        }
    }
}

Как мне изменить getTodo Resolver для получения комментариев (с содержимым, содержащим переданную строку)? Могу ли я сделать это так (доступ, если comments.content содержит переданные аргументы строки содержимого):

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        ## Provide a query expression. **
        "expression": "id = :id",
        "expressionValues" : {
            ":id" : {
                "S" : "${ctx.args.id}"
            }
        }
    },
    "filter": {
        "expression": "contains(comments.content, :content)",
        "expressionValues" : {
            ":content": {
                "S": "${ctx.args.content}"
            }
        }
    }
}

person Reden John Zarra    schedule 17.07.2019    source источник
comment
Вы пробовали ${context.source.content}? Это должно дать вам доступ к родительским аргументам из вложенного преобразователя.   -  person Maurice    schedule 19.07.2019


Ответы (1)


Аргументы GraphQL, к которым вы получаете доступ через $ctx.args, доступны на уровне поля. Поэтому, когда вы обращаетесь к ним при разрешении поля Post.comments, вы получаете обратно все аргументы в этом поле и только в этом поле.

Итак, чтобы получить аргумент строки содержимого, вы можете обновить свой тип Todo до:

type Todo {
    id: ID!
    name: String
    description: String
    priority: Int
    status: TodoStatus
    comments(content: String): [Comment]
}

Другой способ: если вы не хотите раскрывать аргумент содержимого в поле Post.comments и сохранять аргумент в поле Query.getTodo, вы можете передать аргументы через источник. В вашем Query.getTodo преобразователе вы можете вернуть поле content как часть результата задачи. Тогда вы сможете получить к нему доступ внутри Todo.comments распознавателя через $ctx.source.content.

person Tinou    schedule 17.07.2019
comment
Привет, как я могу получить доступ к аргументам содержимого, переданным в комментариях в преобразователе комментариев? - person Reden John Zarra; 18.07.2019
comment
Смогу ли я получить доступ к контенту в резолвере Todo.contents, если передам его в результате резолвера getTodo, используя это: #set($result = $ctx.result) #set($result.content = $util.parseJson($ctx.args.content)) $util.toJson($result) - person Reden John Zarra; 18.07.2019
comment
Какое решение вы выберете? Если вы согласны с изменением схемы, добавив аргумент содержимого в поле Todo.comments, вы можете просто получить доступ к аргументам через $ ctx.args.content в преобразователе Todo.comments. - person Tinou; 18.07.2019