Настройки и переменные окружения
Настройки приложения хранятся в двух местах. Значения, которые различаются на вашем компьютере и на сервере (порт, пароль от базы, ключи), лежат в файле .env. Всё остальное описано в TypeScript-файлах папки config/.
Файл .env
Файл .env в корне проекта создаётся вместе с проектом:
TZ=UTC
PORT=3333
HOST=localhost
LOG_LEVEL=info
APP_KEY=x1yGq4VhT8sZ0cKfR2mN7pLw3bDe9uJa
NODE_ENV=development
SESSION_DRIVER=cookieAPP_KEY — секретный ключ для шифрования cookie и сессий. Если ключ нужно создать заново, выполните node ace generate:key.
Проверка в start/env.ts
AdonisJS не читает .env вслепую. В файле start/env.ts перечислены все переменные и их типы:
// start/env.ts
import { Env } from '@adonisjs/core/env'
export default await Env.create(new URL('../', import.meta.url), {
NODE_ENV: Env.schema.enum(['development', 'production', 'test'] as const),
PORT: Env.schema.number(),
APP_KEY: Env.schema.string(),
HOST: Env.schema.string({ format: 'host' }),
LOG_LEVEL: Env.schema.string(),
SESSION_DRIVER: Env.schema.enum(['cookie', 'memory'] as const),
})При запуске приложение проверяет каждую переменную. Если PORT не число или APP_KEY отсутствует, сервер не стартует и в терминале появится сообщение, какая переменная неверна.
Своя переменная
Добавим в блог число статей на странице. Сначала строка в .env:
POSTS_PER_PAGE=10Затем описание в start/env.ts, внутри того же объекта:
// start/env.ts
POSTS_PER_PAGE: Env.schema.number.optional(),optional() разрешает переменной отсутствовать. Читать значение можно в любом файле:
// app/controllers/posts_controller.ts
import env from '#start/env'
const perPage = env.get('POSTS_PER_PAGE', 10)Второй аргумент get — значение по умолчанию. Тип результата TypeScript знает из схемы: здесь это number.
Папка config
Каждый пакет хранит настройки в своём файле: config/app.ts, config/database.ts, config/session.ts. Свои настройки тоже можно вынести в отдельный файл:
// config/blog.ts
import env from '#start/env'
const blogConfig = {
title: 'Мой блог',
postsPerPage: env.get('POSTS_PER_PAGE', 10),
}
export default blogConfig// app/controllers/posts_controller.ts
import blogConfig from '#config/blog'
console.log(blogConfig.title)Файл настроек — обычный модуль, поэтому его импортируют как любой другой.
Частая ошибка
Переменную добавили в .env, но забыли описать в start/env.ts. Тогда env.get('POSTS_PER_PAGE') вызывает ошибку типов в редакторе, а значение не проверяется. Каждую новую переменную записывайте в оба файла. И не добавляйте .env в Git: в нём секреты, на сервере его создают отдельно.