---
name: azion-escreva-e-teste-uma-funcao
description: >-
  Escreva o handler ES Modules de uma função em Azion Console, leia a resposta dela com Preview deployment e encontre a saída dos logs.
---

# Escreva e teste uma função

Você escreve o código de uma função em JavaScript e lê a resposta que ela retorna, tudo em Azion Console. A função não atende tráfego enquanto uma aplicação ou um firewall não a executar.

Escrever uma função não a executa. Uma função executa quando uma aplicação ou um firewall a instancia e uma regra do [Rules Engine](/pt-br/documentacao/plataforma/applications/rules-engine/) seleciona essa instância. Outras quatro páginas cobrem as partes que esta deixa de fora:

- Para uma primeira execução guiada, de uma conta vazia até uma resposta, consulte [Primeiros passos com Functions](/pt-br/documentacao/plataforma/functions/primeiros-passos/).
- Para saber o que invoca uma função e onde ela executa, consulte [Como Functions funciona](/pt-br/documentacao/plataforma/functions/como-funciona/).
- Para executar a função em uma aplicação, consulte [Execute uma função em uma aplicação](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/funcoes-serverless/).
- Para executar a função em um firewall, consulte [Execute uma função em um firewall](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/firewall/).

---

## Pré-requisitos

- Uma conta Azion. Para criar uma, consulte [Como criar uma conta na Azion](/pt-br/documentacao/fundamentos/criar-uma-conta/).
- A permissão **Edit Functions** na conta. Ela também exige a permissão **View Functions**. Consulte [Teams Permissions](/pt-br/documentacao/fundamentos/teams-permissions/).
- Familiaridade com JavaScript, incluindo [Strict mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode).

---

## Escreva o handler

Uma função exporta um objeto com `export default` e cada propriedade desse objeto é um handler. O vínculo da instância decide qual handler executa: uma instância em uma aplicação executa o handler `fetch` e uma instância em um firewall executa o handler `firewall`. Esse é o padrão ES Modules, a maneira recomendada de estruturar uma função.

Um handler `fetch` recebe a requisição e retorna um `Response`:

```javascript
export default {
  async fetch(request, env, ctx) {
    return new Response('Hello World!');
  },
};
```

O handler recebe três parâmetros:

| Parâmetro | Tipo      | O que carrega                                                                                                        |
| --------- | --------- | -------------------------------------------------------------------------------------------------------------------- |
| `request` | `Request` | A requisição HTTP recebida: o método, a URL, os headers e o body dela.                                               |
| `env`     | Object    | As [variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables/) e os bindings da função. |
| `ctx`     | Object    | O contexto de execução. `ctx.waitUntil(promise)` estende a vida da execução além do ponto em que o handler retorna.  |

`request` é o objeto `Request` da Web. O handler decide pelo `request.method`, lê um cookie a partir de `request.headers` ou interpreta o caminho com `new URL(request.url)`. Para chamar outro sistema durante a execução do handler, use a [Fetch API](/pt-br/documentacao/devtools/runtime/api-reference/fetch/).

A resposta carrega os headers que o código definir. Este handler retorna markup e declara o formato no header `content-type`:

```javascript
const html = `<!DOCTYPE html>
<body>
  <h1>Hello World</h1>
  <p>This markup was generated by Azion Functions.</p>
</body>`;

export default {
  async fetch(request, env, ctx) {
    return new Response(html, {
      headers: {
        'content-type': 'text/html;charset=UTF-8',
      },
    });
  },
};
```

Um handler `firewall` decide se a requisição chega até a aplicação. `ctx.deny()` bloqueia a requisição imediatamente e a requisição segue para o handler `fetch` quando o código não o chama:

```javascript
export default {
  async firewall(request, env, ctx) {
    const userAgent = request.headers.get('User-Agent');

    if (userAgent && userAgent.includes('bot')) {
      ctx.deny();
    }
  },
};
```

Azion Runtime torna o strict mode a opção padrão e obrigatória para o JavaScript de uma função. O strict mode transforma vários erros silenciosos do JavaScript em erros lançados e bloqueia sintaxes que versões futuras do ECMAScript podem definir. Para as Web APIs que o runtime implementa e a referência completa dos handlers, consulte [Azion Runtime](/pt-br/documentacao/devtools/runtime/).

> **nota**
>
> Functions também suporta o padrão Service Worker, que declara um handler com `addEventListener`. Esse padrão é o legado. Para mover código existente para ES Modules, consulte [Migre padrões de handler em Functions](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/migrar-padroes-de-handler/).

---

## Salve o código em Azion Console

O [editor de código](/pt-br/documentacao/plataforma/functions/code-editor/) de uma função é a aba **Code** dela em Azion Console. Ele é construído sobre o Monaco Editor, com syntax highlighting, IntelliSense e debugging. O menu de contexto do editor também carrega o comando **Format Document**. Uma função nova abre com um código de exemplo que você substitui.

Para armazenar o handler em uma função:

1. **Abra a página Functions**

   Acesse [Azion Console](https://console.azion.com/) > **Products Menu** > **Libraries** > **Functions**.

2. **Abra a função**

   Selecione a função que você quer editar. Para começar uma nova, selecione **+ Function** e insira um nome.

3. **Substitua o código na aba Code**

   Na aba **Code**, substitua o código pelo seu handler.

4. **Selecione Save**

Azion Console armazena o código e deixa a função disponível para ser instanciada. Uma instância nomeia a função em vez de guardar uma cópia dela. O código novo, portanto, chega a todas as instâncias que vinculam a função.

O editor também chama as APIs do ChatGPT, então a explicação, a geração e a refatoração de código acontecem dentro do editor. A integração usa as credenciais da sua própria conta OpenAI, declaradas como um comentário no código-fonte. Para as credenciais e os comandos do editor, consulte [Integração com ChatGPT](/pt-br/documentacao/plataforma/functions/ai-integration/).

---

## Teste a resposta com Preview deployment

[Preview deployment](/pt-br/documentacao/plataforma/functions/preview-deployment/) executa a função em Azion Console e mostra a resposta que o código retorna, sem deployment. Ele chama `PreviewProvider`, uma função auxiliar no código-fonte que monta uma requisição simulada para o handler. Os valores dentro de `PreviewProvider` decidem qual caminho da função executa. Altere esses valores e a mesma função responde a uma requisição diferente.

Para ler a resposta antes de a função atender tráfego:

1. **Adicione uma função PreviewProvider ao código-fonte**

   `PreviewProvider` monta a requisição que o preview envia e retorna a resposta que o preview renderiza. Para o formato dela, consulte [Preview deployment](/pt-br/documentacao/plataforma/functions/preview-deployment/).

2. **Leia a saída no editor de código**

   O preview renderiza uma resposta `text/html` como página e uma resposta `application/json` como corpo JSON.

3. **(Opcional) Selecione Open para ler a mesma saída em outra aba do navegador**

4. **Altere os valores dentro de PreviewProvider**

   Altere o método, os headers ou a URL da requisição simulada para exercitar outro caminho do handler. Leia a saída novamente.

A resposta da função aparece em Azion Console antes de qualquer requisição chegar até ela.

> **nota**
>
> Azion Console não renderiza preview enquanto o código-fonte não carregar uma função `PreviewProvider`. O preview mostra um aviso que nomeia a função ausente.

---

## Leia os logs de uma função

Uma função escreve mensagens de log com `console.log`, do mesmo modo que o JavaScript faz em um navegador. Azion coleta essa saída e a entrega em três lugares: [Azion CLI](/pt-br/documentacao/devtools/cli/), [Data Stream](/pt-br/documentacao/plataforma/data-stream/) e [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/). Enquanto você não abrir um deles, uma função que falha e uma função que nunca executa parecem iguais.

Para ler a saída a partir de um terminal:

```bash
azion logs cells --tail
```

O terminal imprime as mensagens de console dos últimos 5 minutos e continua imprimindo as novas. Adicione `--function-id` para restringir a saída a uma função.

Para ler a mesma saída em Azion Console, vá até **Real-Time Events** e selecione a aba **Functions Console**. Cada entrada carrega o nível da mensagem, a linha dela e o identificador da requisição que a produziu.

Quando os logs não explicam o comportamento, o sintoma decide onde procurar em seguida:

- [Solução de problemas de execução e logs de funções](/pt-br/documentacao/plataforma/functions/solucao-de-problemas/) - as correções para uma função que nunca executa, que para antes de responder ou que não escreve nada.
- [Faça o debug de functions no Data Stream](/pt-br/documentacao/guias/plataforma/observabilidade/debugging-functions-data-stream/) - envie a saída de log de uma função para um endpoint seu.
- [Consulte logs de funções com GraphQL API](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/debugging-functions-graphql/) - consulte os eventos de uma função pela GraphQL API.

---

## Próximos passos

- [Execute uma função em uma aplicação](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/funcoes-serverless.md): Adicione a regra do Rules Engine que executa a instância, em Azion Console ou na Azion API.
- [Execute uma função em um firewall](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/firewall.md): Instancie a função em um firewall e adicione a regra que a dispara.
- [Variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables.md): Guarde configurações e segredos fora do código da função e leia cada um por chave em tempo de execução.
- [Exemplos em JavaScript](/pt-br/documentacao/plataforma/functions/javascript-exemplos.md): Código de funções para adaptar à sua própria lógica.
- [Boas práticas de Functions](/pt-br/documentacao/plataforma/functions/boas-praticas.md): O que cada parte do handler faz e as escolhas de design que mantêm uma invocação dentro dos limites.
- [Azion Runtime](/pt-br/documentacao/devtools/runtime.md): As Web APIs, as assinaturas dos handlers e a lista de compatibilidade com Node.js.
