Оволодійте основами: створення API для списку завдань з MongoDB та Node.js

Практичний посібник зі створення повністю функціонального бекенду з операціями CRUD за допомогою Express і Mongoose.

Бажаєте почати свою подорож у розробку бекенду з Node.js і MongoDB? У цьому підручнику ми створимо API для списку завдань (To-Do List), яке дозволяє користувачам ефективно додавати, створювати, оновлювати та видаляти завдання.

Незалежно від того, чи ви вивчаєте розробку бекенду, чи хочете освіжити свої навички, цей проєкт допоможе вам зрозуміти ключові концепти, такі як операції CRUD та інтеграція з базою даних. Після завершення цього посібника ви зрозумієте, як реалізувати операції CRUD, керувати базою даних MongoDB і налаштувати надійний бекенд для своїх застосунків.

1. Налаштування проєкту

Перед тим як зануритись у код, давайте налаштуємо середовище.

Попередні умови:

  • Встановіть Node.js.
  • Встановіть MongoDB або використовуйте Docker для контейнеризованих баз даних.

Встановлення залежностей:

Виконайте наступні команди, щоб ініціалізувати проєкт і встановити необхідні пакунки:

npm init -y  
npm install express mongoose nodemon

Структура файлів:

Ось структура нашого проєкту:

/server  
 ├── index.js  
 ├── package.json  
 ├── docker-compose.yml

2. Налаштування MongoDB за допомогою Docker

Для спрощення управління базою даних ми використаємо Docker для запуску MongoDB та Mongo Express. Також я використав MongoDB Compass завдяки його інтуїтивному інтерфейсу, що полегшує управління базою даних і робить процес візуальним.

Конфігурація Docker Compose:

Ми налаштуємо MongoDB та Mongo Express у файлі docker-compose.yml, щоб спростити налаштування:

services:  
 mongodb:  
 image: mongo  
 container_name: mongodb  
 ports:  
 - "27017:27017"  
 volumes:  
 - "mongo_data:/data/db"  
 mongo-express:  
 image: mongo-express  
 container_name: mongo-express  
 ports:  
 - "8081:8081"  
 environment:  
 ME_CONFIG_MONGODB_SERVER: mongodb  
 ME_CONFIG_BASICAUTH_USERNAME: ${ME_CONFIG_BASICAUTH_USERNAME}  
 ME_CONFIG_BASICAUTH_PASSWORD: ${ME_CONFIG_BASICAUTH_PASSWORD}  
volumes:  
 mongo_data:

Запуск MongoDB з Docker:

Щоб запустити сервіси, виконайте наступну команду у терміналі:

docker-compose up -d

Доступ до MongoDB Compass:

Після запуску MongoDB відкрийте MongoDB Compass, підключіться до вашої бази даних за адресою mongodb://localhost:27017 і почніть керувати своїми колекціями та документами візуально. Compass надає інтуїтивно зрозумілий інтерфейс, що робить його відмінною альтернативою інструментам командного рядка або навіть Mongo Express для дослідження ваших даних.

Ви все ще можете отримати доступ до Mongo Express за адресою http://localhost:8081, але я вважаю MongoDB Compass зручнішим для роботи з цим проєктом.

3. Створення схеми завдання за допомогою Mongoose

Ми визначимо схему для завдань у нашому API списку завдань за допомогою Mongoose.

const taskSchema = new mongoose.Schema(  
 {  
 title: { type: String, required: true },  
 description: { type: String, required: false },  
 status: { type: String, enum: ["pending", "completed"], default: "pending" },  
 priority: { type: String, enum: ["low", "medium", "high"], default: "medium" },  
 dueDate: { type: Date },  
 },  
 { timestamps: true }  
);  
const Task = mongoose.model("task", taskSchema);

Операції CRUD

## a) Отримання завдань (`GET /tasks`)

Отримати всі завдання з бази даних:

app.get("/tasks", async (req, res) => {
try {
const tasks = await Task.find();
console.log([GET/tasks] Отримано ${tasks.length} завдань.);
res.json(tasks);
} catch (err) {
console.error([GET/tasks] Помилка: ${err.message});
res.status(500).json({ error: err.message });
}
});
```

b) Створення завдання (POST /tasks)

Додати нове завдання до бази даних:

app.post("/tasks", async (req, res) => {  
 try {  
 if (!req.body.title) {  
 console.warn(`[POST/tasks] Перевірка не пройшла: заголовок є обов'язковим.`);  
 return res.status(400).json({ error: "Заголовок є обов'язковим" });  
 }  

 const newTask = new Task(req.body);  
 await newTask.save();  

 console.log(`[POST/tasks] Завдання створене успішно з ID: ${newTask._id}`);  
 res.status(201).json(newTask);  
 } catch (err) {  
 res.status(400).json({ error: err.message });  
 }  
});

c) Оновлення завдання (PUT /tasks/:id)

Оновити існуюче завдання за його ID:

app.put("/tasks/:id", async (req, res) => {  
 try {  
 const { id } = req.params;  
 const updatedTask = await Task.findByIdAndUpdate(id, req.body);  

 if (!updatedTask) {  
 console.warn(`[PUT/tasks/${id}] Завдання не знайдено.`);  
 return res.status(404).json({ error: "Завдання не знайдено!" });  
 }  

 console.log(`[PUT/tasks/${id}] Завдання успішно оновлене.`);  
 res.json({  
 message: "Завдання успішно оновлено!",  
 updatedTask,  
 });  
 } catch (err) {  
 console.error(`[PUT/tasks/${req.params.id}] Помилка: ${err.message}`);  
 res.status(500).json({ error: err.message });  
 }  
});

d) Видалення завдання (DELETE /tasks/:id)

Видалити завдання за його ID:

app.delete("/tasks/:id", async (req, res) => {  
 try {  
 const { id } = req.params;  
 const deletedTask = await Task.findByIdAndDelete(id);  

 if (!deletedTask) {  
 console.warn(`[DELETE/tasks/${id}] Завдання не знайдено.`);  
 return res.status(404).json({ error: "Завдання не знайдено!" });  
 }  

 console.log(`[DELETE/tasks/${id}] Завдання успішно видалене.`);  
 res.json({  
 message: "Завдання успішно видалене!",  
 deletedTask,  
 });  
 } catch (err) {  
 console.error(`[DELETE/tasks/${req.params.id}] Помилка: ${err.message}`);  
 res.status(500).json({ error: err.message });  
 }  
});

5. Запуск сервера

З встановленим nodemon, ви можете запустити сервер і автоматично перезапускати його щоразу, коли змінюється код.

Запуск сервера:

Виконайте наступну команду:

nodemon index.js

API тепер буде доступне за адресою http://localhost:3000. Завдяки nodemon немає потреби вручну перезапускати сервер після кожної зміни в коді — все буде оброблятись автоматично!

6. Тестування API за допомогою Postman

Використовуйте Postman для тестування кінцевих точок API.

Приклад запитів:

  • GET /tasks

Отримати всі завдання. Як видно знизу, цей запит отримує і відображає список завдань з бази даних.

pic

  • POST /tasks

Створити нове завдання. Цей запит додає нове завдання до бази даних із деталями, наданими в тілі запиту. З огляду на мою схему даних, я використав наступні тестові дані для перевірки результатів операцій POST, PUT і DELETE.

pic

  • PUT /tasks/:id

Оновити існуюче завдання. Цей запит змінює деталі завдання, яке ідентифікується за його ID, як показано в прикладі даних нижче.

pic

  • DELETE /tasks/:id

Видалити завдання. Цей запит видаляє завдання з бази даних за його ID, як показано при видаленні тестових даних нижче.

pic

7.

Висновок

Це API для списку завдань демонструє потужність та простоту використання Node.js, Express і MongoDB для розробки бекенду. Незалежно від того, чи ви початківець, який удосконалює свої навички, чи середній розробник, який шукає швидке оновлення, цей проект є чудовою точкою відліку для практики операцій CRUD і створення масштабованих API.

Продовжуючи свою подорож, розгляньте можливість розширити цей додаток, додавши нові функції або розгорнувши його в продакшн-середовище. Можливості безмежні, і кожен крок наблизить вас до майстерності в розробці бекенду.

Якщо ви хочете дізнатися більше про код, не соромтеся переглянути мій репозиторій на GitHub, відвідавши посилання на проект і ознайомившись з деталями.

Щасливого кодування! 🚀

Перекладено з: Master the Basics: Building a To-Do List API with MongoDB and Node.js

Leave a Reply

Your email address will not be published. Required fields are marked *