| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -690,6 +690,120 @@ app.listen(port, host, () => { | |||
| 690 | 690 | ||
| 691 | 691 | Теперь наше API умеет читать акции, создавать, а также удалять их. | |
| 692 | 692 | ||
| 693 | + ## 5. Пишем API на NestJS | ||
| 694 | + | ||
| 695 | + NestJS - мощный фреймворк для создания серверных приложений на NodeJS с полной поддержкой TypeScript и готовой архитектурой из коробки. Также NestJS предоставляет DI систему, которая позволяет гибко конфигурировать провайдеры приложения. | ||
| 696 | + | ||
| 697 | + Начнем с установки CLI и создания нового приложения: | ||
| 698 | + | ||
| 699 | + | ||
| 700 | + ```shell | ||
| 701 | + npm i -g @nestjs/cli | ||
| 702 | + nest new lab4 --strict | ||
| 703 | + ``` | ||
| 704 | + | ||
| 705 | + ```shell | ||
| 706 | + ✨ We will scaffold your app in a few seconds.. | ||
| 707 | + | ||
| 708 | + ✔ Which package manager would you ❤️ to use? npm | ||
| 709 | + CREATE lab4/.prettierrc (51 bytes) | ||
| 710 | + CREATE lab4/README.md (5020 bytes) | ||
| 711 | + CREATE lab4/eslint.config.mjs (856 bytes) | ||
| 712 | + CREATE lab4/nest-cli.json (171 bytes) | ||
| 713 | + CREATE lab4/package.json (2030 bytes) | ||
| 714 | + CREATE lab4/tsconfig.build.json (97 bytes) | ||
| 715 | + CREATE lab4/tsconfig.json (541 bytes) | ||
| 716 | + CREATE lab4/src/app.controller.ts (274 bytes) | ||
| 717 | + CREATE lab4/src/app.module.ts (249 bytes) | ||
| 718 | + CREATE lab4/src/app.service.ts (142 bytes) | ||
| 719 | + CREATE lab4/src/main.ts (228 bytes) | ||
| 720 | + CREATE lab4/src/app.controller.spec.ts (617 bytes) | ||
| 721 | + CREATE lab4/test/jest-e2e.json (183 bytes) | ||
| 722 | + CREATE lab4/test/app.e2e-spec.ts (674 bytes) | ||
| 723 | + | ||
| 724 | + ✔ Installation in progress... ☕ | ||
| 725 | + | ||
| 726 | + 🚀 Successfully created project lab4 | ||
| 727 | + | ||
| 728 | + ``` | ||
| 729 | + | ||
| 730 | + NestJS cli создаст скелет приложения. Запустим командой `npm run start` и посмотрим на результат `http://localhost:3000`: | ||
| 731 | + | ||
| 732 | +  | ||
| 733 | + | ||
| 734 | + В данной лабораторной будет разработан сервис карточек, реализующий следующий REST API: | ||
| 735 | + | ||
| 736 | + - GET /stocks/ - получение всех карточек | ||
| 737 | + - POST /stocks - создание новой карточки | ||
| 738 | + - GET /stocks/:id - получение карточки по ID | ||
| 739 | + - PATCH /stocks/:id - обновление карточки по ID | ||
| 740 | + - DELETE /stocks/:id - удаление карточки по ID | ||
| 741 | + | ||
| 742 | + Создадим сущности, необходимые для CRUD операциями над карточками `stocks`. Флаг `--no-spec` отключает генерацию тестовых файлов - в данной лабораторной они не понадобятся. | ||
| 743 | + | ||
| 744 | + ```shell | ||
| 745 | + ➜ lab4 git:(main) ✗ nest generate resource stocks --no-spec | ||
| 746 | + ✔ What transport layer do you use? REST API | ||
| 747 | + ✔ Would you like to generate CRUD entry points? Yes | ||
| 748 | + CREATE src/stocks/stocks.controller.ts (915 bytes) | ||
| 749 | + CREATE src/stocks/stocks.module.ts (255 bytes) | ||
| 750 | + CREATE src/stocks/stocks.service.ts (623 bytes) | ||
| 751 | + CREATE src/stocks/dto/create-stock.dto.ts (31 bytes) | ||
| 752 | + CREATE src/stocks/dto/update-stock.dto.ts (173 bytes) | ||
| 753 | + CREATE src/stocks/entities/stock.entity.ts (22 bytes) | ||
| 754 | + UPDATE package.json (2063 bytes) | ||
| 755 | + UPDATE src/app.module.ts (316 bytes) | ||
| 756 | + ✔ Packages installed successfully. | ||
| 757 | + ``` | ||
| 758 | + | ||
| 759 | + При генерации нового CRUD источника автоматически создаются следующие абстракции: | ||
| 760 | + | ||
| 761 | + - Module - группирующая сущность для объединения нескольких элементов, решающих общую задачу; | ||
| 762 | + - Controller - контроллер эндпоинтов, отвечает за обработку пользовательских запросов и возвращение корректных результатов; | ||
| 763 | + - Service - сервис, отвечающий за определенную логику взаимодействия; | ||
| 764 | + - Entities - модели данных источника; | ||
| 765 | + - Dto - "транспортные" сущности, отражающие состояние модели данных при передаче между архитектурными границами приложения | ||
| 766 | + | ||
| 767 | + После кодогенерации получаем такие файлы в папке `stocks`: | ||
| 768 | + | ||
| 769 | + `stocks.controller`: | ||
| 770 | + ```ts | ||
| 771 | + @Controller('stocks') | ||
| 772 | + export class StocksController { | ||
| 773 | + constructor(private readonly stocksService: StocksService) {} | ||
| 774 | + | ||
| 775 | + @Post() | ||
| 776 | + create(@Body() createStockDto: CreateStockDto) { | ||
| 777 | + return this.stocksService.create(createStockDto); | ||
| 778 | + } | ||
| 779 | + | ||
| 780 | + @Get() | ||
| 781 | + findAll() { | ||
| 782 | + return this.stocksService.findAll(); | ||
| 783 | + } | ||
| 784 | + | ||
| 785 | + @Get(':id') | ||
| 786 | + findOne(@Param('id') id: string) { | ||
| 787 | + return this.stocksService.findOne(+id); | ||
| 788 | + } | ||
| 789 | + | ||
| 790 | + @Patch(':id') | ||
| 791 | + update(@Param('id') id: string, @Body() updateStockDto: UpdateStockDto) { | ||
| 792 | + return this.stocksService.update(+id, updateStockDto); | ||
| 793 | + } | ||
| 794 | + | ||
| 795 | + @Delete(':id') | ||
| 796 | + remove(@Param('id') id: string) { | ||
| 797 | + return this.stocksService.remove(+id); | ||
| 798 | + } | ||
| 799 | + } | ||
| 800 | + ``` | ||
| 801 | + | ||
| 802 | + `stocks.module`: | ||
| 803 | + `stocks.service`: | ||
| 804 | + | ||
| 805 | + ... | ||
| 806 | + | ||
| 693 | 807 | ## 7. ЗАДАНИЕ | |
| 694 | 808 | ||
| 695 | 809 | 1. Необходимо в ваши проекты с 3-5 лабораторную работу добавить возможность добавления и удаления карточек. | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,26 @@ | |||
| 1 | + [ | ||
| 2 | + { | ||
| 3 | + "id": 1, | ||
| 4 | + "src": "https://i.pinimg.com/originals/c9/ea/65/c9ea654eb3a7398b1f702c758c1c4206.jpg", | ||
| 5 | + "title": "Акция", | ||
| 6 | + "text": "Такой акции вы еще не видели 1" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "id": 2, | ||
| 10 | + "src": "https://i.pinimg.com/originals/c9/ea/65/c9ea654eb3a7398b1f702c758c1c4206.jpg", | ||
| 11 | + "title": "Акция", | ||
| 12 | + "text": "Такой акции вы еще не видели 2" | ||
| 13 | + }, | ||
| 14 | + { | ||
| 15 | + "id": 3, | ||
| 16 | + "src": "https://i.pinimg.com/originals/c9/ea/65/c9ea654eb3a7398b1f702c758c1c4206.jpg", | ||
| 17 | + "title": "Акция", | ||
| 18 | + "text": "Такой акции вы еще не видели 3" | ||
| 19 | + }, | ||
| 20 | + { | ||
| 21 | + "id": 5, | ||
| 22 | + "src": "https://i.pinimg.com/originals/c9/ea/65/c9ea654eb3a7398b1f702c758c1c4206.jpg", | ||
| 23 | + "title": "Акция", | ||
| 24 | + "text": "Такой акции вы еще не видели 5" | ||
| 25 | + } | ||
| 26 | + ] | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments