

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# AWS AppSync JavaScript referencia de objeto de contexto de resolución
<a name="resolver-context-reference-js"></a>

AWS AppSync define un conjunto de variables y funciones para trabajar con controladores de solicitudes y respuestas. Esto simplifica las operaciones lógicas realizadas en los datos en GraphQL. En este documento se describen estas funciones y se proporcionan ejemplos.

## Acceso a `context`
<a name="accessing-the-context-js"></a>

El argumento `context` de un controlador de solicitudes y respuestas es un objeto que contiene toda la información contextual para la invocación del solucionador. Tiene la estructura siguiente:

```
type Context = {
  arguments: any;
  args: any;
  identity: Identity;
  source: any;
  error?: {
    message: string;
    type: string;
  };
  stash: any;
  result: any;
  prev: any;
  request: Request;
  info: Info;
};
```

**nota**  
A menudo verá que se hace referencia al objeto `context` como `ctx`.

Cada campo del mapa `context` se define de la siguiente manera:

### Campos `context`
<a name="accessing-the-context-list-js"></a>

** `arguments` **  
Un mapa que contiene todos los argumentos de GraphQL de este campo.

** `identity` **  
Un objeto que contiene información sobre el intermediario. Consulte [Identidad](#aws-appsync-resolver-context-reference-identity-js) para obtener más información acerca de la estructura de este campo.

** `source` **  
Un mapa que contiene la resolución del campo principal.

** `stash` **  
El stash es un objeto que está disponible dentro de cada solucionador y controlador de funciones. Una misma instancia stash perdura durante una única ejecución de solucionador. Esto significa que puede utilizar el stash para pasar datos arbitrarios a controladores de solicitudes y respuestas, así como a las funciones de un solucionador de canalización.   
No puede eliminar ni reemplazar todo el stash, pero sí puede agregar, actualizar, eliminar y leer sus propiedades. 
Puede agregar elementos al stash modificando uno de los siguientes ejemplos de código:  

```
//Example 1
ctx.stash.newItem = { key: "something" }

//Example 2
Object.assign(ctx.stash, {key1: value1, key2: value})
```
Puedes eliminar elementos del stash modificando el siguiente código:  

```
delete ctx.stash.key
```

** `result` **  
Un contenedor para los resultados de este solucionador. Este campo solo está disponible para los controladores de respuestas.  
Por ejemplo, al solucionar el campo `author` de la siguiente consulta:  

```
query {
    getPost(id: 1234) {
        postId
        title
        content
        author {
            id
            name
        }
    }
}
```
A continuación, la variable completa `context` está disponible cuando se evalúa un controlador de respuestas:  

```
{
  "arguments" : {
    id: "1234"
  },
  "source": {},
  "result" : {
      "postId": "1234",
      "title": "Some title",
      "content": "Some content",
      "author": {
        "id": "5678",
        "name": "Author Name"
      }
  },
  "identity" : {
      "sourceIp" : ["x.x.x.x"],
      "userArn" : "arn:aws:iam::123456789012:user/appsync",
      "accountId" : "666666666666",
      "user" : "AIDAAAAAAAAAAAAAAAAAA"
  }
}
```

** `prev.result` **  
Es el resultado de cualquier operación previa que se haya ejecutado en un solucionador de canalización.  
Si la operación anterior era el controlador de solicitudes del solucionador de canalización, `ctx.prev.result` representa el resultado de la evaluación y estará disponible para la primera función de la canalización.  
Si la operación anterior era la primera función, `ctx.prev.result` representa el resultado de la evaluación del primer controlador de respuesta de la función, y estará disponible para la segunda función de la canalización.  
Si la operación anterior era la última función, `ctx.prev.result` representa el resultado de la evaluación de la última función, y estará disponible para el controlador de respuestas del solucionador de canalización.

** `info` **  
Un objeto que contiene información sobre la solicitud de GraphQL. Para obtener información sobre la estructura de este campo, consulte [Información](#aws-appsync-resolver-context-reference-info-js).

### Identidad
<a name="aws-appsync-resolver-context-reference-identity-js"></a>

La sección `identity` contiene información sobre el intermediario. La forma de esta sección depende del tipo de autorización de tu AWS AppSync API.

Para obtener más información sobre las opciones de AWS AppSync seguridad, consulta [Autorización y autenticación](security-authz.md#aws-appsync-security).

** Autorización de `API_KEY`**  
El campo `identity` no se rellena.

**Autorización de `AWS_LAMBDA`**  
La `identity` tiene el siguiente formato:  

```
type AppSyncIdentityLambda = {
  resolverContext: any;
};
```
La `identity` contiene la clave `resolverContext`, que contiene el mismo contenido `resolverContext` devuelto por la función de Lambda que autoriza la solicitud.

** Autorización de `AWS_IAM`**  
La `identity` tiene el siguiente formato:  

```
type AppSyncIdentityIAM = {
  accountId: string;
  cognitoIdentityPoolId: string;
  cognitoIdentityId: string;
  sourceIp: string[];
  username: string;
  userArn: string;
  cognitoIdentityAuthType: string;
  cognitoIdentityAuthProvider: string;
};
```

** Autorización de `AMAZON_COGNITO_USER_POOLS`**  
La `identity` tiene el siguiente formato:  

```
type AppSyncIdentityCognito = {
  sourceIp: string[];
  username: string;
  groups: string[] | null;
  sub: string;
  issuer: string;
  claims: any;
  defaultAuthStrategy: string;
};
```

Cada campo se define de la siguiente manera:

** `accountId` **  
El identificador de AWS cuenta de la persona que llama.

** `claims` **  
Las notificaciones que tiene el usuario.

** `cognitoIdentityAuthType` **  
Autenticado o no según el tipo de identidad.

** `cognitoIdentityAuthProvider` **  
Una lista separada por comas de la información del proveedor de identidad externo utilizada para obtener las credenciales que se usan para firmar la solicitud.

** `cognitoIdentityId` **  
El ID de identidad de Amazon Cognito del intermediario.

** `cognitoIdentityPoolId` **  
El ID de grupo de identidades de Amazon Cognito asociado al intermediario.

** `defaultAuthStrategy` **  
La estrategia de autorización predeterminada para este intermediario (`ALLOW` o `DENY`).

** `issuer` **  
El emisor del token.

** `sourceIp` **  
La dirección IP de origen de la persona que llama y que AWS AppSync la recibe. Si la solicitud no incluye el encabezado `x-forwarded-for`, el valor de IP de origen solo contiene una dirección IP de la conexión TCP. Si la solicitud incluye un encabezado `x-forwarded-for`, la IP de origen será una lista de las direcciones IP del encabezado `x-forwarded-for`, además de la dirección IP de la conexión TCP.

** `sub` **  
El UUID del usuario autenticado.

** `user` **  
El usuario de IAM.

** `userArn` **  
Es el nombre de recurso de Amazon (ARN) del usuario de IAM.

** `username` **  
El nombre de usuario del usuario autenticado. En el caso de una autorización `AMAZON_COGNITO_USER_POOLS`, el valor de *nombre de usuario* es el valor del atributo *cognito:username*. En el caso de la `AWS_IAM` autorización, el valor del *nombre de usuario* es el valor del AWS usuario principal. Si utiliza una autorización de IAM con credenciales proporcionadas desde grupos de identidad de Amazon Cognito, le recomendamos que use `cognitoIdentityId`.

### Acceso a los encabezados de solicitud
<a name="aws-appsync-resolver-context-reference-util-js"></a>

AWS AppSync admite pasar encabezados personalizados desde los clientes y acceder a ellos en sus resolutores de GraphQL mediante. `ctx.request.headers` Puede utilizar los valores de encabezado para acciones como insertar datos en un origen de datos o incluso efectuar comprobaciones de autorización. Puede usar uno o varios encabezados de solicitud usando `$curl` con una clave de API desde la línea de comandos, como se muestra en los siguientes ejemplos:

**Ejemplo de encabezado único** 

Supongamos que establece un encabezado `custom` con un valor `nadia` como el siguiente:

```
curl -XPOST -H "Content-Type:application/graphql" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql
```

Se puede obtener acceso a este encabezado con `ctx.request.headers.custom`. Por ejemplo, podría encontrarse en el siguiente código para DynamoDB:

```
"custom": util.dynamodb.toDynamoDB(ctx.request.headers.custom)
```

**Ejemplo de varios encabezados** 

También puede enviar varios encabezados en una única solicitud y obtener acceso a ellos en el controlador del solucionador. Por ejemplo, si el encabezado `custom` se define con dos valores:

```
curl -XPOST -H "Content-Type:application/graphql" -H "custom:bailey" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql
```

Puede obtener acceso a ellos como una matriz, por ejemplo `ctx.request.headers.custom[1]`.

**nota**  
AWS AppSync no expone el encabezado de la cookie. `ctx.request.headers`

### Acceso al nombre de dominio personalizado de la solicitud
<a name="aws-access-requested-custom-domain-names-js"></a>

AWS AppSync admite la configuración de un dominio personalizado que puede utilizar para acceder a sus puntos finales de GraphQL y en tiempo real para su. APIs Al hacer una solicitud con un nombre de dominio personalizado, puede obtener el nombre de dominio utilizando. `ctx.request.domainName`

Cuando se utiliza el nombre de dominio de punto de conexión predeterminado de GraphQL, el valor es. `null`

### Información
<a name="aws-appsync-resolver-context-reference-info-js"></a>

La sección `info` contiene información sobre la solicitud de GraphQL. Esta sección incluye la siguiente forma:

```
type Info = {
  fieldName: string;
  parentTypeName: string;
  variables: any;
  selectionSetList: string[];
  selectionSetGraphQL: string;
};
```

Cada campo se define de la siguiente manera:

** `fieldName` **  
El nombre del campo que se está resolviendo actualmente.

** `parentTypeName` **  
El nombre del tipo principal del campo que se está resolviendo actualmente.

** `variables` **  
Un mapa que contiene todas las variables que se pasan a la solicitud de GraphQL.

** `selectionSetList` **  
Una representación de lista de los campos del conjunto de selección de GraphQL. Solo se hace referencia a los campos con alias por el nombre de alias, no por el nombre de campo. El ejemplo siguiente muestra detalladamente esta estructura.

** `selectionSetGraphQL` **  
Una representación en forma de cadena del conjunto de selección, formateado como lenguaje de definición de esquema (SDL) de GraphQL. Aunque los fragmentos no se combinan en el conjunto de selección, los fragmentos insertados se conservan, como se muestra en el ejemplo siguiente.

**nota**  
`JSON.stringify` no incluye ni `selectionSetGraphQL` ni `selectionSetList` en la serialización de cadenas. Debe hacer referencia a estas propiedades directamente.

Por ejemplo, al resolver el campo `getPost` de la siguiente consulta:

```
query {
  getPost(id: $postId) {
    postId
    title
    secondTitle: title
    content
    author(id: $authorId) {
      authorId
      name
    }
    secondAuthor(id: "789") {
      authorId
    }
    ... on Post {
      inlineFrag: comments: {
        id
      }
    }
    ... postFrag
  }
}

fragment postFrag on Post {
  postFrag: comments: {
    id
  }
}
```

La variable `ctx.info` completa que está disponible al procesar un controlador podría ser:

```
{
  "fieldName": "getPost",
  "parentTypeName": "Query",
  "variables": {
    "postId": "123",
    "authorId": "456"
  },
  "selectionSetList": [
    "postId",
    "title",
    "secondTitle"
    "content",
    "author",
    "author/authorId",
    "author/name",
    "secondAuthor",
    "secondAuthor/authorId",
    "inlineFragComments",
    "inlineFragComments/id",
    "postFragComments",
    "postFragComments/id"
  ],
  "selectionSetGraphQL": "{\n  getPost(id: $postId) {\n    postId\n    title\n    secondTitle: title\n    content\n    author(id: $authorId) {\n      authorId\n      name\n    }\n    secondAuthor(id: \"789\") {\n      authorId\n    }\n    ... on Post {\n      inlineFrag: comments {\n        id\n      }\n    }\n    ... postFrag\n  }\n}"
}
```

`selectionSetList` expone solo los campos que pertenecen al tipo actual. Si el tipo actual es una interfaz o una unión, solo se exponen los campos seleccionados que pertenecen a la interfaz. Por ejemplo, en el caso del esquema siguiente:

```
type Query {
    node(id: ID!): Node
}

interface Node {
    id: ID
}

type Post implements Node {
    id: ID
    title: String
    author: String
}

type Blog implements Node {
    id: ID
    title: String
    category: String
}
```

Y en la siguiente consulta:

```
query {
    node(id: "post1") {
        id
        ... on Post {
            title
        }

        ... on Blog {
            title
        }
    }
}
```

Cuando se llama a `ctx.info.selectionSetList` con la resolución del campo `Query.node`, solo se expone `id`:

```
"selectionSetList": [
    "id"
]
```