Настройки и переменные окружения
Порт, путь к базе данных, секретные ключи различаются на вашем компьютере и на сервере, поэтому их не пишут в коде. Их передают через переменные окружения — значения, которые операционная система даёт процессу при запуске. В Node.js они доступны в объекте process.env.
Файл .env
Создайте в корне проекта файл .env:
PORT=3000
DB_FILE=blog.db
JWT_SECRET=замените-на-длинную-случайную-строкуКаждая строка — переменная ИМЯ=значение. Файл с настоящими секретами не добавляют в Git: допишите строку .env в .gitignore.
Загрузка через --env-file
Node.js 22 умеет сам читать такой файл. Измените скрипты в package.json:
{
"scripts": {
"dev": "node --watch --env-file=.env src/server.js",
"start": "node --env-file=.env src/server.js"
}
}Теперь переменные доступны в коде:
// src/server.js
import { buildApp } from './app.js';
const app = buildApp({ logger: true });
const port = Number(process.env.PORT ?? 3000);
await app.listen({ port });Поменяйте в .env порт на 3001 и перезапустите npm run dev — сервер откроется на новом порту. Все значения из process.env — строки, поэтому порт переводится в число.
Проверка настроек: @fastify/env
Если забыть переменную, ошибка всплывёт не при старте, а позже, в случайном месте. Плагин @fastify/env проверяет переменные по JSON Schema при запуске:
npm install @fastify/env// src/app.js
import Fastify from 'fastify';
import fastifyEnv from '@fastify/env';
const envSchema = {
type: 'object',
required: ['JWT_SECRET'],
properties: {
PORT: { type: 'integer', default: 3000 },
DB_FILE: { type: 'string', default: 'blog.db' },
JWT_SECRET: { type: 'string', minLength: 16 },
},
};
export function buildApp(options = {}) {
const app = Fastify(options);
app.register(fastifyEnv, { schema: envSchema });
// ...остальные плагины и маршруты
return app;
}Плагин читает process.env, переводит значения в нужные типы и кладёт результат в app.config. Без JWT_SECRET сервер не запустится и сообщит, какой переменной не хватает.
Использование
Настройки появляются после загрузки плагинов, поэтому в src/server.js сначала дождитесь ready():
// src/server.js
const app = buildApp({ logger: true });
await app.ready();
await app.listen({ port: app.config.PORT });В маршрутах и плагинах значения доступны как app.config.DB_FILE.
Частая ошибка
Файл .env с секретами попадает в Git, а оттуда — к посторонним. Держите в репозитории только .env.example с пустыми значениями, а настоящий .env создавайте на каждом компьютере и сервере отдельно.