---
name: azion-solucione-problemas-de-uma-aplicacao-opennext
description: >-
  Descubra por que uma aplicação OpenNext na Azion oculta erros, falha no deployment ou não lê variáveis de ambiente e aplique a correção.
---

# Solucione problemas de uma aplicação OpenNext

Esta página lista os sintomas que uma aplicação OpenNext pode apresentar na Azion, cada um com a causa e a correção. O código da aplicação é executado como uma [função](/pt-br/documentacao/plataforma/functions/), então os logs, os limites e as variáveis de ambiente de Functions se aplicam a ele. Os sintomas cobrem erros que você não consegue ver, contexto de requisição que você não consegue ler, um deployment recusado pelo tamanho e variáveis de ambiente ausentes.

---

## Um erro só aparece depois do deployment

O código que funcionava na sua máquina falha quando é executado na Azion. Cada tentativa de correção exige então outro deployment antes que você veja se ela funcionou.

Sem uma execução local, a função implantada é o primeiro lugar em que o seu código encontra Azion Runtime. Cada erro então custa um deployment para aparecer.

Para detectar o erro antes do deployment:

- **Execute a aplicação localmente**: [Azion CLI](/pt-br/documentacao/devtools/cli/) inicia um servidor local que simula a plataforma Azion. Cada requisição que você envia a esse servidor executa a sua função. O terminal imprime a saída de `console.log` do código e qualquer erro que ele gerar. Para o comando e as opções dele, consulte [Desenvolva e teste uma function localmente](/pt-br/documentacao/plataforma/functions/local-development/).
- **Corrija o código e envie a requisição de novo**: a alteração é executada na sua máquina, sem deployment e sem efeito no tráfego de produção.

O erro e a saída dos seus logs agora aparecem no terminal antes que o código chegue à produção.

---

## Uma função implantada falha sem mostrar um erro

Em produção, a aplicação responde de um jeito que você não esperava, e nada indica onde o código errou.

Uma função implantada envia a saída de `console.log` e os erros dela para a Azion, não para o seu terminal. Até você ler essa saída lá, a única evidência que você tem é a resposta que a função retornou.

Para ler o que a função registrou:

- **Acompanhe as novas linhas de log pelo terminal**: Azion CLI transmite os logs das suas funções à medida que eles chegam. Use-a para um problema que está acontecendo agora ou para observar a aplicação durante um novo deployment.
- **Filtre e pesquise os logs no Azion Console**: [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/) lista a saída de `console.log` das suas funções. Ele filtra os eventos por período e pesquisa uma mensagem neles. Cada evento mostra o ID da função e o timestamp dele.
- **Consulte as linhas de log com GraphQL**: a API GraphQL retorna as mesmas linhas em formato estruturado, para automação ou para um sistema de monitoramento que você já usa. O dataset `functionConsoleEvents` dela retorna cada linha com o timestamp, o ID da função e o ID de configuração. Uma consulta pode filtrar as linhas por intervalo de tempo e pelo texto que elas contêm. Crie e teste a consulta no GraphQL Playground do Azion Console antes de levá-la para as suas ferramentas.

Para os passos em cada interface, consulte [Solução de problemas de execução e logs de funções](/pt-br/documentacao/plataforma/functions/solucao-de-problemas/).

A linha que o seu código registrou, ou o erro que a função gerou, agora aponta para o caminho do código que falhou.

---

## A lógica que depende da requisição dá o resultado errado

Roteamento, bloqueio por região ou personalização de conteúdo não se comporta como você espera para alguns clientes.

Uma lógica desse tipo lê o contexto da requisição, como o lugar de onde ela vem. A resposta não mostra esse contexto. A falha pode estar nos valores que o seu código recebeu, e não no código em si.

Para ver os valores que a sua lógica recebe:

- **Registre os metadados da requisição que a sua lógica lê**: a [API de metadados](/pt-br/documentacao/devtools/runtime/api-reference/metadata/) dá a uma função o contexto da requisição, como `geoip_continent_code`, o código do continente do cliente. Escreva o valor com `console.log` ao lado da decisão que o usa.
- **Leia a linha nos logs**: faça o deployment da alteração e depois leia os logs pela Azion CLI, pelo Real-Time Events ou pela API GraphQL. Para os passos, consulte [Solução de problemas de execução e logs de funções](/pt-br/documentacao/plataforma/functions/solucao-de-problemas/).

Cada linha de log agora associa o código do continente de uma requisição ao caminho que o seu código seguiu para ela.

---

## Um deployment falha porque a função é grande demais

O deployment para com um erro sobre o tamanho da função.

O código empacotado é maior do que a Azion aceita para uma função. [Limites de Functions](/pt-br/documentacao/plataforma/functions/limites/#limites-default) limita o código a 20 MB quando você faz o deployment dele pela Azion API. O código criado ou editado no Azion Console tem um limite de 6 MB.

Para deixar o bundle dentro do limite:

- **Encontre as dependências grandes**: analise o bundle com uma ferramenta como o [Webpack Bundle Analyzer](https://www.npmjs.com/package/webpack-bundle-analyzer) ou o [ESBuild Analyzer](https://esbuild.github.io/analyze/).
- **Remova as dependências não usadas**: verifique o `package.json` e a base de código em busca de pacotes que a aplicação não usa.
- **Importe só as funções que você usa**: importe uma função em vez de uma biblioteca inteira. Escreva `import { parse } from "date-fns"` em vez de `import * as dateFns from "date-fns"`.
- **Entregue assets estáticos e arquivos grandes a partir de um storage**: mova esses arquivos para [Object Storage](/pt-br/documentacao/plataforma/object-storage/) e faça referência a eles por URL em vez de empacotá-los.
- **Solicite um limite maior**: os limites de tamanho de código são valores padrão. Para aumentar um deles no seu plano, entre em contato com o [suporte técnico](/pt-br/documentacao/suporte/).

Com o bundle dentro do limite, o deployment não falha mais pelo tamanho da função.

---

## As variáveis de ambiente não estão disponíveis para a função

O código espera uma variável de ambiente e não recebe o valor dela. `Azion.env.get()` retorna `undefined` para uma chave que não existe, e a função continua com esse valor.

Uma função lê só as variáveis que existem na conta, com a chave exata que o código pede. Um valor que você altera depois de um deployment não chega à função que já está em execução.

Para disponibilizar o valor:

- **Crie a variável na conta**: gerencie as variáveis de ambiente pela Azion API, pela Azion CLI ou pelo Azion Terraform provider. Dê à variável a chave exata que o seu código lê.
- **Faça o deployment de novo depois de uma alteração**: um valor novo não chega a uma função em execução. Faça o deployment da função de novo para que a alteração tenha efeito.
- **Leia a variável por uma interface suportada**: `Azion.env.get()` recebe a chave e retorna o valor. Azion Runtime também suporta `process.env` para compatibilidade com Node.js.
- **Evite que o build descarte as variáveis**: em um projeto Next.js, verifique se o processo de build não sobrescreve nem ignora as variáveis.

Para os campos, os limites e as interfaces de gerenciamento, consulte [Variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables/).

A função agora lê o valor que você definiu para a chave.

---

## Recursos relacionados

- [Desenvolva e teste uma function localmente](/pt-br/documentacao/plataforma/functions/local-development.md): O comando que executa o seu código na sua máquina e como enviar requisições a ele.
- [Limites de Functions](/pt-br/documentacao/plataforma/functions/limites.md): Os limites de tamanho de código e todos os outros limites dentro dos quais uma função é executada.
- [Variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables.md): Os campos de uma variável, os limites dela e as interfaces que a gerenciam.
- [API de metadados](/pt-br/documentacao/devtools/runtime/api-reference/metadata.md): Os atributos da requisição que uma função pode ler, de GeoIP a TLS.
