Encodera

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

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

Оглавление

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

Порт, путь к базе данных, секретные ключи различаются на вашем компьютере и на сервере, поэтому их не пишут в коде. Их передают через переменные окружения — значения, которые операционная система даёт процессу при запуске. В 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 создавайте на каждом компьютере и сервере отдельно.

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

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