Definir um Resolvedor Personalizado
Nesta página
- Visão geral
- Procedimento
- Criar um novo revendedor personalizado
- Definir o Nome do Campo do Resolvedor
- Definir o tipo principal
- Definir o Tipo de Entrada
- Definir o tipo de carga útil
- Definir a função Resolver
- Salvar e distribuir o resolvedor
- Exemplos de resolvedores personalizados
- Scenario & Schemas
- Resolvedor de query personalizada
- Mutação personalizada
- Propriedades computadas
Visão geral
Você pode definir resolvedores personalizados que estendem a GraphQL API para os casos de uso do seu aplicativo. Os resolvedores personalizados permitem definir novas operações de nível raiz que são mais complexas ou específicas do que os resolvedores de query e mutação gerados. Também é possível adicionar novos campos calculados a tipos de documento gerados que avaliam dinamicamente um resultado sempre que uma operação lê um documento do tipo estendido.
Procedimento
Definir o Nome do Campo do Resolvedor
Especifique o nome do App Services para o resolvedor na entrada GraphQL Field Name. O App Services expõe o resolvedor personalizado em seu tipo principal usando esse nome, portanto, o nome deve descrever o que o resolvedor faz de uma forma que seja útil para desenvolvedores que trabalham com GraphQL API.
Definir o tipo principal
O App Services expõem cada resolvedor personalizado como um campo em um tipo principal. O tipo principal pode ser uma query em nível raiz, uma mutação ou um tipo de documento gerado.
No menu suspenso Parent Type, selecione uma das seguintes opções:
Opção | Descrição | ||||
---|---|---|---|---|---|
Query | O resolvedor é uma operação de nível de raiz ExemploUm resolvedor personalizado para uma query denominada
| ||||
Mutation | O resolvedor é uma operação de nível raiz ExemploUm resolvedor personalizado para uma mutação denominada
| ||||
Document Type | O resolvedor é uma propriedade computada no tipo de documento especificado. Qualquer query ou mutação que retorna o tipo de documento também pode solicitar propriedades calculadas definidas por resolvedores personalizados no tipo. ExemploUm resolvedor personalizado que define uma propriedade computada no tipo
|
Definir o Tipo de Entrada
Um resolvedor personalizado pode aceitar parâmetros de entrada da query ou mutação recebida. Você pode usar um tipo de entrada gerado existente ou definir um novo tipo de entrada personalizado especificamente para o resolvedor.
Se você especificar um tipo de entrada, o App Services expõe o parâmetro input
na definição do esquema GraphQL gerado pelo resolvedor personalizado como um parâmetro opcional que aceita o tipo de entrada especificado. Se você não especificar um tipo de entrada, o resolvedor personalizado não aceitará nenhum argumento.
No menu suspenso Input Type, selecione uma das seguintes opções:
Opção | Descrição | |||||||
---|---|---|---|---|---|---|---|---|
None | O resolvedor não aceita nenhuma entrada. ExemploUm resolvedor personalizado denominado
| |||||||
Scalar | O resolvedor usa um tipo escalar existente do esquema GraphQL gerado. Na segunda entrada suspensa, selecione um único escalar ou uma array de múltiplos escalares do mesmo tipo. ExemploUm resolvedor personalizado denominado
| |||||||
Existing Type | O resolvedor usa um tipo de entrada existente do esquema GraphQL gerado. Na segunda entrada suspensa, selecione um único objeto de entrada ou uma array de vários objetos de entrada do mesmo tipo. ExemploUm resolvedor personalizado denominado
| |||||||
Custom Type | O App Services gera um novo tipo de entrada especificamente para o resolvedor com base em um esquema definido por você. O esquema deve ser um ExemploUm resolvedor personalizado denominado
|
Definir o tipo de carga útil
Todos os resolvedores GraphQL devem retornar uma carga útil que esteja em conformidade com um tipo específico no esquema. Para um resolvedor personalizado, você pode usar um tipo de documento gerado existente, definir um novo tipo de carga útil personalizada especificamente para o resolvedor ou usar uma carga útil padrão. O App Services inclui o tipo de carga útil especificado na definição do esquema GraphQL gerada pelo resolvedor personalizado.
No menu suspenso Payload Type, selecione uma das seguintes opções:
Opção | Descrição | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
DefaultPayload | O resolvedor retorna o tipo de
O campo
ExemploUm resolvedor personalizado denominado
| ||||||||||
Scalar | O resolvedor usa um tipo escalar existente do esquema GraphQL gerado. Na segunda entrada suspensa, selecione um único escalar ou uma array de múltiplos escalares do mesmo tipo. ExemploUm resolvedor personalizado denominado
| ||||||||||
Existing Type | O resolvedor retorna um tipo de documento existente do esquema GraphQL gerado. Na segunda entrada suspensa, selecione um único tipo de documento ou uma array de vários documentos do mesmo tipo. ExemploUm resolvedor personalizado denominado Um resolvedor personalizado denominado
| ||||||||||
Custom Type | O App Services gera um novo tipo de carga útil especificamente para o resolvedor com base em um esquema definido por você. O esquema deve ser um ExemploUm resolvedor personalizado denominado
|
Definir a função Resolver
Quando um usuário chama um resolvedor personalizado, o App Services executa a função do resolvedor e retorna o resultado, que deve estar em conformidade com o Payload Type do resolvedor.
O App Services transmite à função todos os dados de entrada da operação, se aplicável. Se o resolvedor for uma propriedade calculada em um tipo de documento, o App Services transmitirá à função o documento específico em que o resolvedor foi chamado.
Uma função de resolução personalizada tem uma de duas assinaturas possíveis, dependendo se ela aceita ou não uma entrada:
exports = function myCustomResolver(input, source) { // The `input` parameter that contains any input data provided to the resolver. // The type and shape of this object matches the resolver's input type. const { someArgument } = input; // If the resolver is a computed property, `source` is the parent document. // Otherwise `source` is undefined. const { _id, name } = source; // The return value must conform to the resolver's configured payload type return { "someValue": "abc123", }; }
exports = function myCustomResolver(source) { // If the resolver is a computed property, `source` is the parent document. // Otherwise `source` is undefined. const { _id, name } = parent; // The return value must conform to the resolver's configured payload type return { "someValue": "abc123", }; }
Para definir a função do resolvedor, clique no menu suspenso Function e selecione uma função existente, ou crie uma nova.
Exemplos de resolvedores personalizados
Scenario & Schemas
Considere um dashboard hipotético que uma equipe de vendas usa para mostrar diversas estatísticas e outras métricas de desempenho em um determinado período de tempo. O dashboard usa os resolvedores personalizados nesta seção para gerenciar alguns de seus casos de uso específicos.
Todos os resolvedores podem acessar documentos Sale
, que possuem o seguinte esquema:
type Sale { _id: ObjectId! customer_id: String! year: String! month: String! saleTotal: Float! notes: [String] }
{ "title": "Sale", "bsonType": "object", "required": ["_id", "customer_id", "year", "month", "saleTotal"], "properties": { "_id": { "bsonType": "objectId" }, "customer_id": { "bsonType": "string" }, "year": { "bsonType": "string" }, "month": { "bsonType": "string" }, "saleTotal": { "bsonType": "decimal" }, "notes": { "bsonType": "array", "items": { "bsonType": "string" } } } }
Resolvedor de query personalizada
O painel hipotético da equipe de vendas usa um resolvedor de queries personalizado que retorna dados agregados de vendas para um mês específico.
O App Services gera definições de esquema para os tipos de entrada e carga útil personalizados do resolvedor e adicionam o resolvedor ao seu tipo principal, o Query
de nível raiz:
type Query { averageSaleForMonth(input: AverageSaleForMonthInput): AverageSaleForMonthPayload } input AverageSalesForMonthInput { month: String!; year: String!; } type AverageSaleForMonthPayload { month: String!; year: String!; averageSale: Float!; }
Configuração
O resolvedor usa a seguinte configuração:
Opção | Descrição | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Parent Type |
| |||||||||||||||||||||||
GraphQL Field Name |
| |||||||||||||||||||||||
Input Type | Tipo personalizado:
| |||||||||||||||||||||||
Payload Type | Tipo personalizado:
| |||||||||||||||||||||||
Function |
|
Exemplo de uso
Para chamar esta query personalizada, você pode usar a seguinte operação e variáveis:
query GetAverageSaleForMonth($averageSaleInput: AverageSaleForMonthInput!) { averageSaleForMonth(input: $averageSaleInput) { month year averageSale } }
{ "variables": { "averageSaleInput": { month: "March", year: "2020" } } }
Mutação personalizada
O dashboard hipotético da equipe de vendas usa um resolvedor de mutação personalizado que adiciona uma nota de string a um documento Sale
específico, identificado por seu _id
.
O App Services gera definições de esquema para o tipo de entrada personalizado do resolvedor e adiciona o resolvedor ao seu tipo principal, o Mutation
de nível raiz:
type Mutation { addNoteToSale(input: AddNoteToSaleInput): Sale } input AddNoteToSaleInput { sale_id: ObjectId!; note: String!; }
Configuração
O resolvedor usa a seguinte configuração:
Opção | Descrição | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Parent Type |
| ||||||||||||||||||||||||
GraphQL Field Name |
| ||||||||||||||||||||||||
Input Type | Tipo personalizado:
| ||||||||||||||||||||||||
Payload Type | Tipo existente:
| ||||||||||||||||||||||||
Function |
|
Exemplo de uso
Para chamar esta query personalizada, você pode usar a seguinte operação e variáveis:
mutation AddNoteToSale($addNoteToSaleInput: AddNoteToSaleInput) { addNoteToSale(input: $addNoteToSaleInput) { _id customer_id month year saleTotal notes } }
{ "variables": { "addNoteToSaleInput": { "sale_id": "5f3c2779796615b661fcdc25", "note": "This was such a great sale!" } } }
Propriedades computadas
O dashboard hipotético da equipe de vendas usa um resolvedor personalizado que adiciona uma nova propriedade computada a cada documento Sale
. Quando uma operação solicita o campo computado para um determinado Sale
, o resolvedor faz query de um sistema externo e retorna os casos de suporte arquivados pelo cliente associado.
O App Services gera definições de esquema para o tipo de carga personalizada do resolvedor e adiciona o resolvedor ao seu tipo principal, Sale
:
type Sale { _id: ObjectId! customer_id: String! year: String! month: String! saleTotal: Float! notes: [String] customerSupportCases: [CustomerSupportCase] } type CustomerSupportCase { caseId: String! description: String! }
Configuração
O resolvedor usa a seguinte configuração:
Opção | Descrição | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Parent Type |
| ||||||||||||||||||||||||||
GraphQL Field Name |
| ||||||||||||||||||||||||||
Input Type | none | ||||||||||||||||||||||||||
Payload Type | Tipo personalizado:
| ||||||||||||||||||||||||||
Function |
|
Exemplo de uso
Para usar essa propriedade computada personalizada, você pode executar a seguinte operação:
query GetSalesWithSupportCases { sales { _id customer_id year month saleTotal notes customerSupportCases { caseId description } } }