# Первые шаги

В этом наборе статей вы узнаете основные принципы **Nest**. Чтобы ознакомиться с основными строительными блоками приложений **Nest**, мы создадим базовое приложение [**CRUD**](https://ru.wikipedia.org/wiki/CRUD) с функциями, которые охватывают множество вопросов на начальном уровне.

## Выбор языка программирования

Мы влюблены в [**TypeScript**](https://www.typescriptlang.org/), но прежде всего - мы любим [**Node.js**](https://nodejs.org/en/). Вот почему **Nest** совместим как с TypeScript, так и с чистым **JavaScript**. [**Nest**](https://nestjs.com/) использует преимущества новейших языковых функций, поэтому для использования его с ванильным **JavaScript** нам нужен компилятор [**Babel**](https://babeljs.io/).

В большинстве примеров мы будем использовать **TypeScript**.

## Прежде чем начать

Пожалуйста, убедитесь, что **Node.js** (>= 10.13.0) установлен в вашей операционной системе.

## Настройка

Создать новый проект довольно просто с помощью **Nest CLI**. С установленным **npm** вы можете создать новый проект Nest с помощью следующих команд в вашем терминале ОС:

```
$ npm i -g @nestjs/cli
$ nest new project-name
```

Будет создан каталог проекта, установлены **node** модули и несколько других шаблонных файлов, а каталог `src/` будет создан и заполнен несколькими основными файлами.

Вот краткий обзор этих основных файлов:

| Файл                | Описание                                                                                                                                              |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `app.controller.ts` | Базовый образец контроллера с одним маршрутом.                                                                                                        |
| `app.module.ts`     | Корневой модуль приложения.                                                                                                                           |
| `main.ts`           | Входной файл приложения, использующий основную функцию `NestFactory.create()` для создания экземпляра приложения **Nest** на основе корневого модуля. |

Файл `main.ts` включает в себя асинхронную функцию, которая запускает наше приложение:

```typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();
```

Чтобы создать экземпляр приложения **Nest**, мы используем базовый класс `NestFactory`. `NestFactory` предоставляет несколько статических методов, которые позволяют создавать экземпляр приложения. Метод `create()` возвращает объект приложения, который выполняет интерфейс `INestApplication`. Этот объект предоставляет набор методов, которые описаны в следующих главах. В приведенном выше примере `main.ts` мы просто запускаем наш прослушиватель HTTP, который позволяет приложению ожидать входящие HTTP-запросы.

Обратите внимание, что проект, созданный с помощью **Nest CLI**, создает начальную структуру проекта, которая подталкивает разработчиков придерживаться соглашения о сохранении каждого модуля в отдельном каталоге.

## Платформа

**Nest** стремится быть независимым от платформы. Независимость от платформы позволяет создавать многократно используемые логические части, которыми разработчики могут воспользоваться в нескольких различных типах приложений. Технически Nest может работать с любой HTTP-инфраструктурой Node после создания адаптера. Из коробки поддерживаются две платформы HTTP: [**express**](https://expressjs.com/) и [**fastify**](https://www.fastify.io/). Вы можете выбрать ту, который лучше всего соответствует вашим потребностям.

| Платформа          | Описание                                                                                                                                                                                                                                                                                                                     |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `platform-express` | <p><a href="https://expressjs.com/"><strong>Express</strong></a> - это хорошо известный минималистский веб-фреймворк для node.</p><p>Это проверенная в бою, готовая к работе библиотека с большим количеством ресурсов, реализованных сообществом. Пакет<code>@nestjs/platform-express</code> используется по-умолчанию.</p> |
| `platform-fastify` | [**Fastify**](https://www.fastify.io/) - это высокопроизводительный фреймворк, ориентированный на обеспечение максимальной эффективности и скорости. Его использование рассмотрено в разделе "Производительность" главы "ТЕХНИКИ".                                                                                           |

Какая бы платформа ни использовалась, она предоставляет собственный интерфейс приложения. Они рассматриваются соответственно как `NestExpressApplication` и `NestFastifyApplication`.

Когда вы передаете тип методу `NestFactory.create()`, как в примере ниже, у объекта приложения будут методы, доступные исключительно для этой конкретной платформы. Обратите внимание, однако, что вам не нужно указывать тип, если вы на самом деле не хотите получить доступ к API базовой платформы.

```typescript
const app = await NestFactory.create<NestExpressApplication>(AppModule);
```

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

После завершения процесса установки вы можете запустить следующую команду в командной строке ОС, чтобы запустить приложение, прослушивающее входящие HTTP-запросы:

```bash
$ npm run start
```

Эта команда запускает приложение с HTTP-сервером, прослушивающим порт, определенный в файле `src/main.ts`. После запуска приложения откройте браузер и перейдите по адресу [**http://localhost:3000/**](http://localhost:3000/). Поздравляю с первым HelloWorld на **NestJS**!
