Простое пошаговое руководство по созданию REST API с использованием Node.js, Express и базы данных PostgreSQL (с TS) для приложения todo.
Это первый раз за долгое время, когда я переключился на реляционную базу данных, такую как PostgreSQL, которую мы будем использовать здесь, чтобы использовать ее для любого из моих API или проектов. С тех пор, как я начал использовать MongoDB, я никогда не возвращался к использованию реляционной БД до сих пор.
Предполетные проверки 😅
Прежде чем мы напишем какой-либо код, я хотел бы спросить вас о нескольких вещах, связанных с этим мини-проектом, который мы будем делать.
- Знакомы ли вы с TypeScript, т. е. либо работаете с ним в настоящее время, либо работали с ним в прошлом?
- Вы установили PostgreSQL на свой компьютер и у вас есть работающий экземпляр базы данных, готовый к работе?
- Вы знакомы с базами данных SQL?
Если вы ответили утвердительно на все, а может даже на два, или, может быть, вы начинаете со всем этим и ответили нет на все три вопроса, не беда, давайте начнем 🚀.
Какова наша цель здесь?
Идея состоит в том, чтобы сделать простое приложение todo, которое позволяет пользователю создавать, редактировать, удалять и просматривать свои задачи. И для достижения всех этих функций наше приложение будет взаимодействовать с серверной частью через REST API. Серверной частью будет приложение Node.js/Express с базой данных PostgreSQL.
Теперь, когда мы понимаем, что мы строим, давайте начнем и будем двигаться шаг за шагом. Как всегда, окончательный код этой статьи будет доступен на моем GitHub.
Структура каталогов
Как я упоминал ранее, пользовательский интерфейс для этого приложения не является частью этой статьи, но папка client
, которую вы видите выше, — это то, как мне нравится разделять серверный и клиентский код.
Инициализация всего
- Как только начинается каждый проект узла, запустите
npm init -y
для создания файла package.json, - Как только это будет сделано, мы сможем получить все необходимые зависимости. Поскольку здесь мы используем TypeScript, нам также понадобится
@types
для всех наших зависимостей.
- Идем дальше и добавляем следующие скрипты в
package.json
, чтобы сделать нашу жизнь немного проще.
- Запустите
tsc --init
для инициализации и создания файлаtsconfig.json
. Я держу свой таким, но вы всегда можете настроить его так, как хотите.
Внедрение Postgres 🐘
При создании этих API убедитесь, что ваш локальный экземпляр Postgres работает. Помните, мы установили pg
как зависимость? Пришло время использовать его. Мы создадим новый объект с именем pool
— не стесняйтесь называть его как хотите — и предоставим информацию о нашей локальной базе данных и таблицах для использования.
Следует иметь в виду, что этот объект pool
сможет использовать только существующую базу данных (здесь мы называем ее perntodo
), в отличие от mongoose и MongoDB, где он может быть создан на лету. Если вы еще не создали свою базу данных и таблицу, это будут запросы, которые нам понадобятся в этом проекте —
Возвращение к экспрессу
Нам нужен работающий сервер, верно? Вы, конечно, уже знаете, как это сделать, импортируете все материалы, связанные с Express и cors, создаете и используете промежуточное ПО Express и cors и запускаете сервер, прослушивая некоторые PORT
по вашему выбору — я всегда выбираю 4000
для серверов. Вы увидите, что ToDoRouter
импортируется и используется; мы перейдем к этой части через секунду.
Маршрут для каждой операции
Если вы помните, нам нужно реализовать методы GET, POST, PUT и DELETE, для чего нам нужны следующие маршруты —
Контроллер для каждого маршрута
Когда пользователь отправит HTTP-запрос на любой из маршрутов, он будет использовать соответствующую функцию контроллера для выполнения этой операции. Теперь, чтобы получить доступ к нашей базе данных Postgres, мы, наконец, используем объект pool
. В конечном счете, мы будем запускать запросы, которые мы перечислили ранее, чтобы получить/сделать то, что мы хотим. Мы выполняем наши запросы с помощью метода .query()
— pool.query("query goes here", [variables go here as array])
- Запрос для
onGetAllTodos
—SELECT * FROM todos
- Запрос для
onCreateNewTodo
—INSERT INTO todos (description) VALUES($1) RETURNING *
- Запрос для
onGetTodoById
—SELECT * FROM todos WHERE _id = $1", [id]
- Запрос для
onUpdateTodoById
—UPDATE todos SET description = $1 WHERE _id = $2", [desc, id]
- Запрос для
onDeleteTodoById
—DELETE FROM todos WHERE _id = $1", [id]
Момент истины 🤞
Когда у нас есть controllers
, каждый контроллер подключен к определенному route
, а маршрут импортирован и используется в файле server.ts
, мы можем попробовать этот API. Чтобы протестировать эти конечные точки, вы можете использовать Postman или, как я, использовать файл .rest
.
Подведение итогов
Точно так же у нас есть конечные точки API, которые теперь могут использоваться внешним интерфейсом — созданные с помощью Node, Express и БД PostgreSQL. На этом мы закончили со сборкой сервера — со всем стеком PERN, только еще не с React.
Спасибо за прочтение. Надеюсь, вы нашли его полезным, простым и интересным. Если да, обязательно ознакомьтесь с другими моими статьями, в которых я рассказываю о таких темах, как React, Node.js и TypeScript.
Ваше здоровье! ✌️
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.