Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
Убедитесь заранее что у вас на компьютере установлен Node.js, если его нет, то вам необходимо его скачать.
Создадим простое приложение «Угадай число», которое будет состоять из простого API, где пользователь отправляет свои догадки, а сервер сообщает, угадал он число или нет.
-
Запустите консоль Windows или другой терминал.
-
Установите Nest.js, если до этого он у вас не был установлен:
Запустите консоль Windows или другой терминал.
Установите Nest.js, если до этого он у вас не был установлен:
npm install -g @nestjs/cli- Перейдите в папку, в которой вы хотите создать проект:
Перейдите в папку, в которой вы хотите создать проект:
В данном случае guess-number — это название проекта.
- Откройте проект в удобном для вас редакторе кода, например в VS Code.
Откройте проект в удобном для вас редакторе кода, например в VS Code.
При создании проекта, у вас спросит каким пакетным менеджером вы хотите пользоваться. Вы можете использовать любой удобный для вас, но я буду пользоваться именно npm.
В процессе разработки приложения на Nest.js необходимо устанавливать все необходимые библиотеки и запускать проект в рабочей директории. Если у вас возникли проблемы с установкой или запуском, убедитесь, что вы находитесь в нужной папке.
Структура созданного проекта выглядит следующим образом. Все необходимые для разработки файлы расположены в папке src.
Чтобы запустить проект, введите в консоли:
Если всё успешно, то в консоли отобразятся логи:
Чтобы посмотреть на проект, необходимо самому открыть в браузере ссылку http://localhost:3000/. По ссылке будет отображаться простая страница с текстом «Hello World!».
nest generate module game
nest generate controller game
nest generate service gameОткройте файл src/game/game.service.ts и добавьте логику игры:
import { Injectable } from '@nestjs/common';
@Injectable()
export class GameService {
private randomNumber: number;
private difficulty: string = 'easy'; // Уровень сложности по умолчанию
private range = { easy: 10, medium: 50, hard: 100 }; // Диапазоны сложности
setDifficulty(difficulty: string): string {
if (!this.range[difficulty]) {
return `Неверная сложность! Доступны следующие варианты: ${Object.keys(this.range).join(', ')}`;
}
this.difficulty = difficulty;
return `Сложность установлена на ${difficulty}`;
}
startNewGame(): string {
const maxRange = this.range[this.difficulty];
this.randomNumber = Math.floor(Math.random() * maxRange) + 1;
return `Новая игра началась! Сложность: ${this.difficulty}, диапазон: 1-${maxRange}`;
}
guessNumber(guess: number): string {
if (guess < this.randomNumber) {
return 'Меньше!';
} else if (guess > this.randomNumber) {
return 'Больше!';
} else {
return 'Правильно! Вы угадали число!';
}
}
}Откройте файл src/game/game.controller.ts и настройте эндпоинты. Эндпоинт — это точка взаимодействия клиента с сервером, представленная в виде URL-адреса. Когда клиент отправляет запрос на сервер, он обращается к определённому эндпоинту.
В Nest.js эндпоинты настраиваются в контроллерах с помощью декораторов, таких как @Get, @Post, @Put и т. д. Эти декораторы определяют, какой метод обработки HTTP-запросов будет использоваться для конкретного эндпоинта. В нашем случае, мы будем использовать эндпоинт @Get:
import { Controller, Get, Param, Query } from '@nestjs/common';
import { GameService } from './game.service';
@Controller('game')
export class GameController {
constructor(private readonly gameService: GameService) {}
@Get('set-difficulty/:difficulty')
setDifficulty(@Param('difficulty') difficulty: string): string {
return this.gameService.setDifficulty(difficulty);
}
@Get('start-game')
startGame(): string {
return this.gameService.startNewGame();
}
@Get('guess')
guessNumber(@Query('number') number: string): string {
const guess = parseInt(number, 10);
if (isNaN(guess)) {
return 'Неверное число! Пожалуйста, укажите правильное целое число.';
}
return this.gameService.guessNumber(guess);
}
}Добавьте модуль GameModule в src/app.module.ts:
import { Module } from '@nestjs/common';
import { GameModule } from './game/game.module';
@Module({
imports: [GameModule],
})
export class AppModule {}Если при написании или вставке кода отображаются ошибки, хотя их нет, проблема, скорее всего, связана с проверкой форматирования, выполняемой Prettier. Это означает, что в коде используются пробелы, табуляции или переносы строк, не соответствующие настройкам Prettier.
Чтобы быстро исправить форматирование, введите в консоли следующую команду:
Убедитесь, что в конце команды есть обязательная точка.
После выполнения этой команды Prettier автоматически исправит все проблемы, связанные с переносами строк и форматированием.
Чтобы применить изменения в коде к вашему приложению, необходимо его перезапустить. Для этого выполните команду:
При запуске приложение будет заново собрано, поэтому после каждого изменения в коде его нужно запускать повторно.
- Модуль (
GameModule).
* Объединяет сервис и контроллер, предоставляя их в приложение.- Сервис (
GameService).
* Генерирует случайное число.
* Отвечает за проверку числа и подсказки.
* Сбрасывает игру после угадывания числа.
* Устанавливает сложность.- Контроллер (
GameController).
* Обрабатывает HTTP-запросы.
* Взаимодействует с сервисом и возвращает ответы клиенту.- Объединяет сервис и контроллер, предоставляя их в приложение.
Объединяет сервис и контроллер, предоставляя их в приложение.
-
Генерирует случайное число.
-
Отвечает за проверку числа и подсказки.
-
Сбрасывает игру после угадывания числа.
-
Устанавливает сложность.
Генерирует случайное число.
Отвечает за проверку числа и подсказки.
Сбрасывает игру после угадывания числа.
Контроллер (GameController).
-
Обрабатывает HTTP-запросы.
-
Взаимодействует с сервисом и возвращает ответы клиенту.
Обрабатывает HTTP-запросы.
Взаимодействует с сервисом и возвращает ответы клиенту.
Отправьте запрос на адрес http://localhost:3000/game/set-difficulty/medium, и сложность сохранится как средняя, а диапазон чисел для угадывания — от 1 до 50. Из доступных уровней сложностей есть: easy, medium, hard.
Отправьте запрос на адрес http://localhost:3000/game/start-game, чтобы начать новую игру. Если до этого вы не выбирали сложность, то она будет по умолчанию установлена на легкую.
Отправьте запрос например на http://localhost:3000/game/guess?number=25. Если число меньше загаданного, то сервер вернет «Больше!», и наоборот. Если число верное, то сервер вернёт «Правильно! Вы угадали число!».
Теперь можно загрузить наше приложение на сервер, чтобы оно было доступно для всех, но перед этим его необходимо сперва загрузить на GitHub.
После того как вы разработаете приложение на Nest.js, вам нужно будет переместить файлы из папки на GitHub. Для этого создайте новый приватный репозиторий на GitHub и вернитесь к своему проекту. Затем, используя командную строку и убедившись, что вы находитесь в папке с проектом, загрузите все файлы в свой репозиторий.
- Создаем новый Git-репозиторий в текущей папке:
Создаем новый Git-репозиторий в текущей папке:
- Добавляем все изменения, сделанные в текущей директории, к следующему коммиту. При вводе команды обязательно поставьте точку в конце:
Добавляем все изменения, сделанные в текущей директории, к следующему коммиту. При вводе команды обязательно поставьте точку в конце:
- Создаём коммит, фиксируя все изменения, добавленные командой
git add:
Создаём коммит, фиксируя все изменения, добавленные командой git add:
git commit -m "first commit"- Переименовываем текущую ветку в
mainи устанавливаем её в качестве основной:
Переименовываем текущую ветку в main и устанавливаем её в качестве основной:
- Добавляем удалённый репозиторий под именем
originи связываем его с указанным URL. Вместо моей ссылки укажите ссылку на ваш новый созданный репозиторий:
Добавляем удалённый репозиторий под именем origin и связываем его с указанным URL. Вместо моей ссылки укажите ссылку на ваш новый созданный репозиторий:
git remote add origin https://github.com/Tulopex/guess-number.git- Отправляем изменения из локальной ветки
mainв удаленную веткуmainна репозиторииorigin:
Отправляем изменения из локальной ветки main в удаленную ветку main на репозитории origin:
Для деплоя Nest.js я воспользуюсь сервисом App Platform от Simple-Server. Если вы ещё не клиент Simple-Server, предварительно нужно зарегистрироваться.
Для начала нужно создать новый проект. Введите его название. Также, если хотите, можете добавить описание и иконку проекту.
После того как проект был создан, нужно создать Apps. Это можно сделать как с главного экрана проекта, так и через боковое меню. При создании нужно выбрать тип Backend и фреймворк Nest.js.
Для того чтобы загружать проекты, необходимо привязать профиль на GitHub. После этого укажите название репозитория, который вы создали ранее. В разделе «Регион» выберите тот, который находится ближе к вам и имеет наименьший пинг.
В параметрах конфигурации укажите необходимое количество запросов. В настройках приложения ничего не меняйте.
В описании приложения укажите его наименование, а при необходимости — комментарий. Также выберите проект, с которым будет связано ваше приложение.
Далее можно нажимать на кнопку «Запустить деплой», после чего начнётся автоматическое развёртывание вашего приложения на Nest.js. Через некоторое время приложение запустится, и в случае успешного развертывания проекта в логах деплоя будет написано: «Deployment successfully completed».
Когда приложение запустится, у вас также появится бесплатный домен, который будет привязан к приложению. Найти его можно в разделе «Настройки» вашего приложения. Теперь по этому домену вы можете отправлять различные запросы для взаимодействия с приложением. Чтобы убедиться, что всё работает правильно, отправляйте запросы не на localhost, а на предоставленный вам домен. Например, запрос на начало игры в моём случае выглядит следующим образом:
https://tulopex-guess-number-753f.twc1.net/game/start-game
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.