Skip to content

Запуск приложения

Для конфигурации приложения в различных режимах работы в Steroids существуют два класса - RestApplication и ConsoleApplication. Первый класс запускает NestJS-приложение, которое будет слушать определенный порт и отвечать на запросы. ConsoleApplication запускает приложение в консольном режиме, в котором оно отрабатывает определённую логику и завершает работу. Они оба наследуют абстрактный класс BaseApplication.

BaseApplication

Абстрактный класс для создания конфигурационных классов приложений.

Конфигурация

Конфигурация, используемая в этом классе, представлена интерфейсом IAppModuleConfig, который также должны наследовать интерфейсы конфигураций других модулей. Она содержит базовые классы, применимые для большинства типов приложений - как для REST API, так и для CLI.

О расширении конфигурации написано ниже.

Функциональность

Класс включает механизм инициализации, который загружает переменные окружения, настраивает конфигурацию и подключает модули. Он также определяет абстрактный метод для запуска приложения, который должен быть реализован в наследниках.

При инициализации BaseApplication требует определенной переменную окружения APP_ENVIRONMENT, которая указывает на текущее окружение проекта (например, dev, prod и т.д.).

При значении dev предполагается, что проект запускается в режиме разработки, и в этом случае будет использоваться директория src для загрузки модулей и конфигурационных файлов. Для других значений APP_ENVIRONMENT будет использоваться директория dist, которая обычно содержит скомпилированные файлы.

RestApplication

Класс настройки и запуска REST API приложения.

Конфигурация

Конфигурация, используемая в этом классе, представлена интерфейсом IRestAppModuleConfig, который наследуется от интерфейса IAppModuleConfig, поэтому содержит поля из родительского интерфейса. Собственные поля интерфейса IRestAppModuleConfig включат, в числе прочих, поля для конфигурации CORS, размера тела запроса и безопасного завершения работы приложения

Другие свойства конфигурации, которых нет в данном интерфейсе, но есть в файле окружения:

  • process.env.PORT - порт, на котором будет запущено приложение (по умолчанию 3000)
  • process.env.APP_SENTRY_DSN - адрес DSN для интеграции с Sentry. Sentry будет подключен, только если этот параметр задан.

О расширении конфигурации написано ниже.

Функциональность

Класс реализует механизмы для:

  • Инициализации конфигурации.
  • Настройки документации API с помощью Swagger.
  • Управления CORS.
  • Подключения пайпов, фильтров и интерсепторов.
  • Интеграции с Sentry.
  • Настройки парсеров запросов и обработки завершения работы приложения.

Запуск приложения включает инициализацию всех вышеуказанных механизмов и создание экземпляра сервера.

ConsoleApplication

Класс настройки и запуска CLI-версии приложения.

В основном используется для работы с миграциями и другими задачами, которые не требуют запуска сервера, а выполняются один раз и завершают работу приложения.

В CLI-версии приложения Steroids Nest "из коробки" сразу доступен набор команд для работы с миграциями.

Конфигурация

Конфигурация, используемая в этом классе, представлена интерфейсом IConsoleAppModuleConfig, который наследуется от интерфейса IAppModuleConfig, поэтому содержит поля из родительского интерфейса.

Свойства конфигурации, которых нет в интерфейсе, но есть в файле окружения:

  • process.env.CLI_PATH - директория для выполнения консольных команд (по умолчанию если process.env.APP_ENVIRONMENT равен dev, то scr, иначе dist)

  • process.env.APP_IS_CLI - флаг, показывающий запущено ли приложение в консольном виде (устанавливается автоматически при запуске ConsoleApplication)

О расширении конфигурации написано ниже.

Расширение конфигурации

Для расширения конфигурации нужно создать нужно создать новый тип/интерфейс, который будет содержать/наследовать поля базового интерфейса.

Ниже рассмотрим добавление нового параметра в конфиг на примере конфига для RestApplication.

Функция config внутри декоратора @Module, используемого для класса модуля приложения, должна возвращать значение того же типа, который был определён ранее. Это возвращённое значение затем можно использовать в функции module того же декоратора.

typescript
import {IRestAppModuleConfig} from '@steroidsjs/nest/infrastructure/applications/rest/IRestAppModuleConfig';
import {Module} from '@steroidsjs/nest/infrastructure/decorators/Module';
import baseConfig from '@steroidsjs/nest/infrastructure/applications/rest/config';
import {LoggerModule, Params as LoggerParams} from 'nestjs-pino';

type AppModuleConfig = IRestAppModuleConfig & {logger: LoggerParams};

@Module({
    ...baseConfig,
    config: () => {
        const config: IRestAppModuleConfig = baseConfig.config();

        return {
            ...config,
            logger: {
                exclude: [{method: RequestMethod.ALL, path: 'health'}],
            } as LoggerParams,
        } as AppModuleConfig;
    },
    module: (config: AppModuleConfig) => {
        const module = baseConfig.module(config);
        return {
            ...module,
            imports: [
                ...module.imports,
                LoggerModule.forRoot(config.logger),
            ],
        };
    },
})
export class AppModule {}