Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройки и переменные окружения

Настройки приложения хранятся в двух местах. Значения, которые различаются на вашем компьютере и на сервере (порт, пароль от базы, ключи), лежат в файле .env. Всё остальное описано в TypeScript-файлах папки config/.

Файл .env

Файл .env в корне проекта создаётся вместе с проектом:

TZ=UTC
PORT=3333
HOST=localhost
LOG_LEVEL=info
APP_KEY=x1yGq4VhT8sZ0cKfR2mN7pLw3bDe9uJa
NODE_ENV=development
SESSION_DRIVER=cookie

APP_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: в нём секреты, на сервере его создают отдельно.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.