Variáveis de ambiente
Em vez de manter vários arquivos de configuração, um para cada ambiente, o AdonisJS usa variáveis de ambiente para valores que mudam frequentemente entre seu ambiente local e o de produção. Por exemplo: as credenciais do banco de dados, um sinalizador booleano para alternar o cache de modelos e assim por diante.
Acessar variáveis de ambiente
O Node.js permite que você acesse nativamente as variáveis de ambiente usando o objeto process.env
. Por exemplo:
process.env.NODE_ENV
process.env.HOST
process.env.PORT
No entanto, recomendamos usar o provedor AdonisJS Env, pois ele melhora ainda mais a API para trabalhar com variáveis de ambiente adicionando suporte para validações e fornece informações de tipo estático.
import Env from '@ioc:Adonis/Core/Env'
Env.get('NODE_ENV')
// Com valores padrão
Env.get('HOST', '0.0.0.0')
Env.get('PORT', 3333)
Por que validar variáveis de ambiente?
As variáveis de ambiente são injetadas de fora para dentro em seu aplicativo, e você tem pouco ou nenhum controle sobre elas em sua base de código.
Por exemplo, uma seção da sua base de código depende da existência da variável de ambiente SESSION_DRIVER
.
const driver = process.env.SESSION_DRIVER
// Código fictício
await Session.use(driver).read()
Não há garantia de que, no momento da execução do programa, a variável de ambiente SESSION_DRIVER
exista e tenha o valor correto. Portanto, você deve validá-la em vez de obter um erro mais tarde no ciclo de vida do programa reclamando sobre o valor "undefined".
const driver = process.env.SESSION_DRIVER
if (!driver) {
throw new Error('Missing env variable "SESSION_DRIVER"')
}
if (!['memory', 'file', 'redis'].includes(driver)) {
throw new Error('Invalid value for env variable "SESSION_DRIVER"')
}
Agora imagine escrever essas condicionais em todos os lugares dentro da sua base de código? Bem, não é uma ótima experiência de desenvolvimento.
Validando variáveis de ambiente
O AdonisJS permite que você opcionalmente valide as variáveis de ambiente bem no início do ciclo de vida de inicialização do seu aplicativo e se recusa a iniciar se alguma validação falhar.
Você começa definindo as regras de validação dentro do arquivo env.ts
.
import Env from '@ioc:Adonis/Core/Env'
export default Env.rules({
HOST: Env.schema.string({ format: 'host' }),
PORT: Env.schema.number(),
APP_KEY: Env.schema.string(),
APP_NAME: Env.schema.string(),
CACHE_VIEWS: Env.schema.boolean(),
SESSION_DRIVER: Env.schema.string(),
NODE_ENV: Env.schema.enum(['development', 'production', 'test'] as const),
})
Além disso, o AdonisJS extrai as informações de tipo estático das regras de validação e fornece o IntelliSense para as propriedades validadas.
API Schema
A seguir está a lista de métodos disponíveis para validar as variáveis de ambiente.
Env.schema.string
Valida o valor para verificar se ele existe e se é uma string válida. Strings vazias falham nas validações, e você deve usar a variante opcional para permitir strings vazias.
{
APP_KEY: Env.schema.string()
}
// Marque como opcional
{
APP_KEY: Env.schema.string.optional()
}
Você também pode forçar o valor a ter um dos formatos predefinidos.
// Deve ser um host válido (url ou ip)
Env.schema.string({ format: 'host' })
// Deve ser uma URL válida
Env.schema.string({ format: 'url' })
// Deve ser um endereço de e-mail válido
Env.schema.string({ format: 'email' })
Ao validar o formato url
, você também pode definir opções adicionais para forçar/ignorar o tld
e o protocol
.
Env.schema.string({ format: 'url', tld: false, protocol: false })
Env.schema.boolean
Força o valor a ser uma representação de string válida de um booleano. Os valores a seguir são considerados booleanos válidos e serão convertidos para true
ou false
.
'1', 'true'
são convertidos paraBoolean(true)
'0', 'false'
são convertidos paraBoolean(false)
{
CACHE_VIEWS: Env.schema.boolean()
}
// Marque como opcional
{
CACHE_VIEWS: Env.schema.boolean.optional()
}
Env.schema.number
Força o valor a ser uma representação de string válida de um número.
{
PORT: Env.schema.number()
}
// Marque como opcional
{
PORT: Env.schema.number.optional()
}
Env.schema.enum
Força o valor a ser um dos valores predefinidos.
{
NODE_ENV: Env
.schema
.enum(['development', 'production'] as const)
}
// Marque como opcional
{
NODE_ENV: Env
.schema
.enum
.optional(['development', 'production'] as const)
}
Funções personalizadas
Para todos os outros casos de uso de validação, você pode definir suas funções personalizadas.
{
PORT: (key, value) => {
if (!value) {
throw new Error('Value for PORT is required')
}
if (isNaN(Number(value))) {
throw new Error('Value for PORT must be a valid number')
}
return Number(value)
}
}
- Certifique-se de sempre retornar o valor após validá-lo.
- O valor de retorno pode ser diferente do valor de entrada inicial.
- Inferimos o tipo estático do valor de retorno. Neste caso,
Env.get('PORT')
é um número.
Definindo variáveis no desenvolvimento
Durante o desenvolvimento, você pode definir variáveis de ambiente dentro do arquivo .env
armazenado na raiz do seu projeto, e o AdonisJS irá processá-lo automaticamente.
# .env
PORT=3333
HOST=0.0.0.0
NODE_ENV=development
APP_KEY=sH2k88gojcp3PdAJiGDxof54kjtTXa3g
SESSION_DRIVER=cookie
CACHE_VIEWS=false
Substituição de variáveis
Junto com o suporte padrão para análise do arquivo .env
, o AdonisJS também permite a substituição de variáveis.
HOST=localhost
PORT=3333
URL=$HOST:$PORT
Todas as letras
, números
e o sublinhado (_
) após o cifrão ($
) são analisados como variáveis. Se sua variável contiver qualquer outro caractere, você deve colocá-lo dentro das chaves {}
.
REDIS-USER=foo
REDIS-URL=localhost@${REDIS-USER}
Escape do sinal $
Se o valor de uma variável contiver um sinal $
, você deve escapá-lo para evitar a substituição de variáveis.
PASSWORD=pa\$\$word
Não faça commit do arquivo .env
Os arquivos .env
não são portáteis. Ou seja, as credenciais do banco de dados no seu ambiente local e de produção sempre serão diferentes e, portanto, não há sentido em enviar o .env
para o controle de versão.
Você deve considerar o arquivo .env
pessoal para seu ambiente local e criar um arquivo .env
separado no servidor de produção ou de preparação (e mantê-lo seguro).
O arquivo .env
pode estar em qualquer local do seu servidor. Por exemplo, você pode armazená-lo dentro de /etc/myapp/.env
e então informar o AdonisJS sobre ele da seguinte forma.
ENV_PATH=/etc/myapp/.env node server.js
Definindo variáveis durante os testes
O AdonisJS procurará o arquivo .env.test
quando o aplicativo for iniciado com a variável de ambiente NODE_ENV=test
.
As variáveis definidas dentro do arquivo .env.test
são automaticamente mescladas com o arquivo .env
. Isso permite que você use um banco de dados diferente ou um driver de sessão diferente ao escrever testes.
Definindo variáveis em produção
A maioria dos provedores de hospedagem modernos tem suporte de primeira classe para definir variáveis de ambiente dentro de seu console da web. Certifique-se de ler a documentação do seu provedor de hospedagem e definir as variáveis de ambiente antes de implementar seu aplicativo AdonisJS.