-
Установи Node и npm (Node Package manager). Они нужны для запуска приложения и установки пакетов (в том числе фреймворка express). Можно сделать это с официального сайта: https://nodejs.org/. При установке Node.js установится и npm.
-
Перейди в репозиторий с приложением, затем в папку
express-app, и выполни команду
npm installОна установит необходимые зависимости.
Затем запусти приложение. Способ запуска зависит от твоих ОС и терминала:
- MacOS/Linux:
DEBUG=myapp:* npm run dev- Windows Command Prompt:
set DEBUG=myapp:* & npm run dev- Windows PowerShell:
$env:DEBUG='myapp:*'; npm run devПосле этого открой http://localhost:3000/ и посмотри приветствие от Express. Обрати внимание: в консоли логируются запросы к твоему приложению.
- Посмотри на структуру app.js. Давай разберём, что там происходит.
- Сначала мы подключаем необходимые библиотеки. Делается это с помощью директивы require(), которая присуща Node.js.
- Затем мы создаём объект приложения
var app = express();- Затем мы подключаем разные middleware и обработку запросов (
app.use). - Затем экспортируем настроенный объект приложения
module.exports = app;Главный интерес для нас представляем блок с подключением обработки запросов. С ним мы и будем в дальнейшем работать.
- Давай допишем обработку запроса
/users. Она подключается строчкой
app.use("/users", usersRouter);Выполни запрос https://localhost:3000/users в браузере. Посмотри на ответ.
Открой файл routes/users.js. В нём есть функция, которая принимает объект запроса req (от "request"), объект ответа res (от "response") и коллбэк next,
который позволяет не обрабатывать запрос прямо тут же, а передать управление дальше. Такой паттерн называется Chain of responsibility, а функция в таком случае
называется "middleware".
Сейчас фукнция возвращает строку, давай сделаем, чтобы она возвращала объект, внутри которого будет лежат массив пользователей. Пусть в этом объекте будет поле items с массиво объектов вида
{
"id": 1,
"name": "name"
}Данные придумай самостоятельно.
Приложение перезапускать при этом не нужно - помогает пакет nodemon.
Выполни запрос за пользователями заново, посмотри на ответ. Должен быть твой объект в виде json.
- Давай научимся отправлять запросы в бэкенд не из браузера. Для этого воспользуемся http-файлами (файлы с раширением
.http).
- В WebStorm клиент для них уже встроен (Tools -> HTTP Client -> Create request in HTTP client).
- Для Visual Studio Code есть расширение "REST Client", которое позволит писать и отправлять запросы точно так же, как в WebStorm.
Для его установки открой меню
Extensions(в левой панели это иконка с кубиками, затем в поисковике найдт расширениеREST Client.
Открой HTTP-клиент, создай файл запроса (с расширением .http) и напиши следующий запрос:
GET http://localhost:3000/users
Accept: application/jsonПроверь, что в ответе будет тот же JSON, что в браузере.
-
Давай добавим метод создания пользователя: POST /users. Сделай сохранение пользователя в какой-нибудь объект, принимай его в виде JSON. Для того, чтобы обратиться к объекту внутри тела, используй
req.body- там лежит уже распарсенный json (благодаря тому, что парсинг подключен строчкойapp.use(express.json());). -
Теперь сделаем псевдо-аутентификацию. Для того, чтобы обращаться к методам бэкенда, будем принимать в query string параметр
authсо значениемtrue. Чтобы не проверять аутентификацию для каждого обработчика (он же "роут") отдельно, напишем middleware, которая будет делать это универсально. Для этого напиши обработчик вapp.jsвида
app.use((req, res, next) => {...});В обработчике возьми свойство query у req и возьми из него нужный параметр (можно через стандартный индексатор объекта).
Подключи его до обработчиков запросов, в которых есть указание пути. Обрати внимание: middleware подключаются в порядке использования.
Таким же образом можно проверять аутентификацию другими способами (по cookie, header'у и т.д.)
- Мы сделали сохранение пользователей в оперативную память, но при перезапуске приложения все данные будут теряться. Подключим базу данных SQLite. Останови приложение и выполни в папке с ним команду
npm install sqlite3Затем добавь код создания таблицы в файл с обработкой запросов с пользователями:
const sqlite3 = require('sqlite3').verbose()
const db = new sqlite3.Database('mydb.db');
db.run(`CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name text)`);Обрати внимание - id теперь будет присваиваться в базе, в запросе можно его не передавать. После этого в обработчик создания пользователя добавь сохранение в БД:
const insert = "INSERT INTO users (name) VALUES (?)";
db.run(insert, [name]);В методе получения пользователей сделай получение их из БД с помощью
db.all("SELECT id, name FROM users", [], (err, rows) => {
if (err) {
console.log(err);
} else {
res.send(rows);
}
});Обрати внимание, обработки ошибки всегда в коллбэке, передаваемом третьим параметром.