Что такое CRUD?

Ответ

CRUD — это акроним, описывающий четыре фундаментальные операции для работы с данными в приложении:

  • Create (Создание)
  • Read (Чтение)
  • Update (Обновление)
  • Delete (Удаление)

В экосистеме Node.js CRUD-операции чаще всего реализуются в виде RESTful API с использованием фреймворков, таких как Express или Nest.js, и взаимодействием с базой данных через драйвер или ORM/ODM.

Пример набора базовых маршрутов Express для сущности Task:

const express = require('express');
const router = express.Router();
const Task = require('../models/Task'); // Модель Mongoose

// CREATE
router.post('/', async (req, res) => {
  try {
    const task = new Task(req.body);
    await task.save();
    res.status(201).json(task);
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});

// READ (все)
router.get('/', async (req, res) => {
  const tasks = await Task.find({});
  res.json(tasks);
});

// READ (один)
router.get('/:id', async (req, res) => {
  const task = await Task.findById(req.params.id);
  if (!task) return res.status(404).json({ message: 'Task not found' });
  res.json(task);
});

// UPDATE
router.patch('/:id', async (req, res) => {
  const task = await Task.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true });
  if (!task) return res.status(404).json({ message: 'Task not found' });
  res.json(task);
});

// DELETE
router.delete('/:id', async (req, res) => {
  const task = await Task.findByIdAndDelete(req.params.id);
  if (!task) return res.status(404).json({ message: 'Task not found' });
  res.status(204).send();
});

В реальных проектах эти операции дополняются валидацией входящих данных (например, с помощью Joi или class-validator), аутентификацией, авторизацией, пагинацией и фильтрацией для операций чтения.

Ответ 18+ 🔞

А, CRUD! Ну это же классика, ёпта! Как хлеб с маслом для любого бэкендера. Если ты это не понимаешь, то у тебя доверия ебать ноль к карьере в вебе.

Смотри, расшифровывается просто, как валенок:

  • Create (Создать) — воткнул новую запись в базу.
  • Read (Прочитать) — вытащил её оттуда, посмотрел.
  • Update (Обновить) — поправил, потому что накосячил или данные поменялись.
  • Delete (Удалить) — отправил нахуй, стёр к хуям.

В мире Node.js это обычно такие REST API, которые ты пишешь на Express или Nest.js, а данные пихаешь в какую-нибудь MongoDB через Mongoose или в PostgreSQL через Prisma. Волнение ебать начинается, когда пытаешься это всё связать.

Вот смотри, как это выглядит в коде для какой-нибудь сущности, ну, например, Task (задача). Представь, что это твой список дел, который ты вечно откладываешь.

const express = require('express');
const router = express.Router();
const Task = require('../models/Task'); // Это наша модель, типа шаблон для задачи

// CREATE (Создать) - Родил новую задачку
router.post('/', async (req, res) => {
  try {
    const task = new Task(req.body); // Берем то, что пришло в теле запроса
    await task.save(); // И пихаем в базу
    res.status(201).json(task); // Отправляем назад с криком "Ура, родилось!"
  } catch (error) {
    res.status(400).json({ error: error.message }); // А если ошибка - "Иди нахуй, неправильно заполнил"
  }
});

// READ (Прочитать всё) - Достал весь свой бардак-список
router.get('/', async (req, res) => {
  const tasks = await Task.find({}); // Находим ВСЕ задачи без фильтра
  res.json(tasks); // Вываливаем эту кучу пользователю
});

// READ (Прочитать одну) - Ищешь конкретную задачку, которую забыл
router.get('/:id', async (req, res) => {
  const task = await Task.findById(req.params.id); // Ищешь по айдишнику
  if (!task) return res.status(404).json({ message: 'Task not found' }); // Если нет - "Извини, хуй найдёшь"
  res.json(task); // Если нашёл - вот, держи, счастливчик
});

// UPDATE (Обновить) - Передумал, решил задачу переименовать
router.patch('/:id', async (req, res) => {
  const task = await Task.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true });
  if (!task) return res.status(404).json({ message: 'Task not found' }); // Опять не нашёл? Ну ты и **распиздяй**
  res.json(task); // Всё ок, вот тебе обновлённая версия
});

// DELETE (Удалить) - Всё, забил хуй, удаляю эту задачу нафиг
router.delete('/:id', async (req, res) => {
  const task = await Task.findByIdAndDelete(req.params.id);
  if (!task) return res.status(404).json({ message: 'Task not found' });
  res.status(204).send(); // Отправляем пустой ответ, типа "дело сделано, нет тела"
});

Конечно, в реальной жизни всё сложнее, я тебе скажу. Тут же надо данные проверять (валидация), чтобы тебе какую-нибудь манду с ушами в базу не запихнули. Надо проверять, кто это делает (аутентификация), и имеет ли он право (авторизация). А когда задач становится овердохуища, надо делать пагинацию и фильтры, чтобы не грузить всё разом. Но основа, чувак, вот она, эти четыре операции — пизда рулю всего бэкенда. Выучи это, и половина пути уже пройдена.