Запуск приложения
Для конфигурации приложения в различных режимах работы в 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 того же декоратора.
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 {}