# node:async_hooks

O módulo `node:async_hooks` rastreia o ciclo de vida de recursos assíncronos, como descreve a [documentação do async\_hooks do Node.js](https://nodejs.org/api/async_hooks.html). Os hooks dele são acionados em cada estágio de uma operação assíncrona, para propagação de contexto e depuração. No Azion Runtime, o módulo está disponível por meio da compatibilidade com Node.js. O uso comum dele em uma function é `AsyncLocalStorage`, que carrega dados do escopo da requisição, como um ID de requisição, entre chamadas assíncronas.

Em uma function com deploy feito e com `azion dev`, `AsyncLocalStorage` mantém o store dele através de um `await` e dentro de um callback de `setTimeout`, e, fora de `run()`, `getStore()` não retorna nenhum valor. `AsyncResource` também funciona: `runInAsyncScope()` executa o callback dele e retorna o valor do callback.

---

## Exemplo

A function abaixo lê o header `X-Request-Id`, armazena o valor com `AsyncLocalStorage` e o registra em log a partir de funções que não o recebem como argumento:

```javascript
/**
 * An example of using the Node.js Async Hooks API in an Azion Function.
 * @example
 * // Build and run locally with the Azion CLI:
 * azion build
 * azion dev
 */
import { AsyncLocalStorage } from "node:async_hooks";

const requestId = new AsyncLocalStorage();

function logAsyncContext(state) {
  console.log(`${requestId.getStore()} - ${state}`);
}

function doSomething() {
  logAsyncContext("log from sync function");
  setTimeout(() => doSomethingElse(), 100);
}

function doSomethingElse() {
  logAsyncContext("log from setTimeout callback");
}

/**
 * Example of using the Node.js Async Hooks API
 * @param {*} event
 * @returns {Promise<Response>}
 */
async function main(event) {
  const id = event.request.headers.get("X-Request-Id") ?? "unknown";

  return requestId.run(id, () => {
    doSomething();
    logAsyncContext("log from another sync function");
    return new Response("ok");
  });
}

export default main;
```

Uma requisição com o header `X-Request-Id: req-1` recebe o corpo `ok`. Enquanto a requisição é executada, a function registra estas linhas em log:

```text
req-1 - log from sync function
req-1 - log from another sync function
```

---

## Recursos relacionados

- [APIs do Node.js](/pt-br/documentacao/devtools/runtime/node.md): Todos os módulos do Node.js que o Azion Runtime resolve e como cada um se comporta.
- [node:timers](/pt-br/documentacao/devtools/runtime/node/timers.md): As funções de timer, como a chamada a setTimeout que este exemplo agenda.
- [Use APIs do Node.js com polyfills](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/use-polyfills.md): Como o build resolve APIs do Node.js por meio de polyfills, mostrado em um projeto JavaScript.
- [Handlers](/pt-br/documentacao/devtools/runtime/api-reference/handlers.md): O formato de handler recomendado e o aviso de obsolescência que `azion build` imprime para o formato `export default main` que este exemplo usa.
