# Постановка задачи. Создание сервера express.js. Подключение и настройка ORM Sequelize. >В этом блоке лекций я пишу пример для предметной области "ресторан", но вы должны разрабатывать АПИ для своей предметной области, выбранной для курсового проекта. Напишем полноценное АПИ для проекта "ресторан" используя **express.js**. 1. Создадим проект и разберёмся в его структуре. 1. Подключение к БД (познакомимся с ORM **Sequelize**, научимся делать миграции) 1. Разработаем конечные точки для получения меню и формирования корзины **Содержание:** * [Создание проекта](#создание-проекта) * [Подключение к БД](./express02.md#подключение-к-бд) * [Использование sequelize для получения данных из БД](#использование-sequelize-для-получения-данных-из-бд) * [Создание скрипта для наполнения БД начальными данными](#создание-скрипта-для-наполнения-бд-начальными-данными) * [Добавление сущностей БД, реализация REST.](#добавление-сущностей-бд-реализация-rest) * [JWT-авторизация](#jwt-авторизация) ## Создание проекта Для больших проектов лучше использовать [генератор](https://expressjs.com/ru/starter/generator.html), но там много лишнего. Создадим [простой проект](https://expressjs.com/ru/starter/hello-world.html): 1. Создайте каталог для проекта и перейдите в него 1. Запустите команду `npm init` для создания проекта (__Node Packet Manager__ - менеджер пакетов Node входит в дистрибутив `Node.js`) На все вопросы отвечаем по-умолчанию, кроме **entry point** (точка входа), тут пишем `app.js` (можно оставить и по-умолчанию, это ни на что не влияет) ``` package name: (api) version: (1.0.0) description: entry point: (index.js) app.js ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ test command: git repository: keywords: author: license: (ISC) type: (commonjs) ``` 1. Добавьте в зависимости проекта пакет `express.js` командой `npm install express` 1. Создайте файл `.gitignore` ```.gitignore node_modules ``` В каталог `node_modules` устанавливаются зависимости проекта, их хранить в репозитории не нужно. Ссылки на зависимости записываются в фалй `package.json` и их можно восстановить командой `npm install` >Внимание!!! За каталог `node_modules` в репозитории ставлю `2` - сервер не резиновый Ниже пример списка зависимостей проекта: ```json "dependencies": { "express": "^5.1.0", "jsonwebtoken": "^9.0.2", "md5": "^2.3.0", "mysql2": "^3.14.1", "sequelize": "^6.37.7", "sequelize-cli": "^6.6.3" } ``` 1. Создайте файл `app.js` (или `index.js`, если оставили настройки по-умолчанию) Ниже пример "hello world" проекта с официального сайта **express.js** ```js const express = require('express') const app = express() const port = 3000 app.get('/', (req, res) => { // в ответ на запрос возвращаем просто текст res.send('Hello World!') }) app.listen(port, () => { console.log(`Example app listening on port ${port}`) }) ``` Что здесь происходит? * `const express = require('express')` - импортируем модуль `express` * `const app = express()` - создаём экземпляр приложения * `const port = 3000` - определяем порт, на котором приложение будет слушать запросы. Прибивать гвоздями не совсем хорошо, но в перспективе мы завернём апи в контейнер. Сейчас главное чтобы порт никем не использовался. * `app.get('/', (req, res) => {...})` - **endpoint** (конечная точка), которая будет обрабатывать входящий запрос. В данном случае метод `GET` по пути `/`. В параметрах лямбда функции объекты `req` (_request_ - запрос, из этого объекта мы можем извлечь параметры и тело запроса) и `res` (_response_ - ответ, сюда мы должны вернуть результат запроса) * `app.listen(port, () => {...})` - запуск сервера, ждущего входящих запросов на указанном порту Можно было не заводить переменную `port`, а прямо сюда вписать `3000`, но обычно такие параметры задаются _переменными окружения_, с которыми мы познакомимся чуть позже. Запустить проект можно командой `node app.js`, либо настройть запуск в VSCode. В браузере должна открываться страница [`localhost:3000`](http://localhost:3000), возвращающая `Hello World!` ![](./express01.png) ## Задание - Создать АПИ сервер на express.js с конечной точкой `GET /` - Подготовить ER-диаграмму для своей предметной области (базу данных пока делать не нужно, я сначала проверю "правильность" диаграммы)