Покращення API: Сортування, обмеження полів та пагінація в Node.js і MongoDB

APIs знаходяться в центрі сучасних додатків, і зробити їх більш ефективними та зручними для користувачів є критично важливим як для розробників, так і для кінцевих користувачів. Три потужні техніки — сортування, обмеження полів та пагінація — можуть зробити ваш API значно більш гнучким. У цьому блозі ми розглянемо, як реалізувати ці функції у вашому бекенді на Node.js та MongoDB.

pic

Крок 1: Реалізація сортування

Сортування дозволяє клієнтам отримувати дані у визначеному порядку, наприклад, у зростаючому чи спадному за ціною, рейтингом або іншим полем.

Приклад запиту:

GET /api/v1/tours?sort=price

Цей запит повинен повернути всі тури, відсортовані за ціною у зростаючому порядку.

Для сортування у спадному порядку користувачі можуть додати мінус перед полем:

GET /api/v1/tours?sort=-price

Реалізація:

Ось як ви можете додати функціональність сортування:

const getAllTours = async (req, res) => {  
 try {  
 // 1. Отримати параметр сортування  
 let query = Tour.find();  

 if (req.query.sort) {  
 const sortBy = req.query.sort.split(',').join(' '); // Обробка кількох критеріїв сортування  
 query = query.sort(sortBy);  
 } else {  
 query = query.sort('-createdAt'); // Сортування за датою створення за замовчуванням  
 }  

 // 2. Виконання запиту  
 const tours = await query;  

 res.status(200).json({  
 status: 'success',  
 results: tours.length,  
 data: { tours },  
 });  
 } catch (err) {  
 res.status(400).json({  
 status: 'fail',  
 message: err.message,  
 });  
 }  
};

Крок 2: Обмеження полів

Під час передачі даних клієнту не завжди потрібно включати всі поля з бази даних. Обмеження полів зменшує розмір даних і підвищує продуктивність.

Приклад запиту:

GET /api/v1/tours?fields=name,price,duration

Цей запит повинен повертати лише поля name, price та duration для кожного туру.

Реалізація:

Ось як ви можете реалізувати обмеження полів:

const getAllTours = async (req, res) => {  
 try {  
 let query = Tour.find();  

 // 1. Обмеження полів  
 if (req.query.fields) {  
 const fields = req.query.fields.split(',').join(' ');  
 query = query.select(fields);  
 } else {  
 query = query.select('-__v'); // Виключити внутрішні поля за замовчуванням  
 }  

 // 2. Виконання запиту  
 const tours = await query;  

 res.status(200).json({  
 status: 'success',  
 results: tours.length,  
 data: { tours },  
 });  
 } catch (err) {  
 res.status(400).json({  
 status: 'fail',  
 message: err.message,  
 });  
 }  
};

Крок 3: Додавання пагінації

Пагінація розбиває великі набори даних на керовані частини, що робить ваш API більш масштабованим. Це особливо корисно для великих колекцій.

Приклад запиту:

GET /api/v1/tours?page=2&limit=10

Цей запит повинен повернути другу сторінку результатів із 10 елементами на сторінці.

Реалізація:

Ось як ви можете додати пагінацію до вашого API:

const getAllTours = async (req, res) => {  
 try {  
 let query = Tour.find();  

 // 1. Пагінація  
 const page = req.query.page * 1 || 1; // Конвертація в число, сторінка 1 за замовчуванням  
 const limit = req.query.limit * 1 || 100; // Ліміт 100 за замовчуванням  
 const skip = (page - 1) * limit; // Розрахунок пропущених документів  

 query = query.skip(skip).limit(limit);  

 // 2. Обробка сторінок, що виходять за межі  
 const tours = await query;  
 const totalTours = await Tour.countDocuments();  
 if (skip >= totalTours) {  
 return res.status(404).json({  
 status: 'fail',  
 message: 'Page does not exist',  
 });  
 }  

 res.status(200).json({  
 status: 'success',  
 results: tours.length,  
 data: { tours },  
 });  
 } catch (err) {  
 res.status(400).json({  
 status: 'fail',  
 message: err.message,  
 });  
 }  
};

Найкращі практики

  1. Комбінуйте функції: Сортування, обмеження полів та пагінація повинні працювати разом без перешкод.
  2. Встановіть замовчування: Задавайте розумні значення за замовчуванням для сортування, полів і пагінації, щоб підвищити зручність використання.
    3.
    Документуйте ваш API: Чітко пояснюйте, як клієнти можуть використовувати ці функції, через детальну документацію API.

Тестуйте крайні випадки

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

Висновок

Сортування, обмеження полів і пагінація — це необхідні інструменти для створення надійного API. Реалізувавши ці функції у вашому бекенді на Node.js та MongoDB, ви зможете створити більш ефективний та зручний для користувача застосунок. Виділіть час, щоб експериментувати з цими техніками у вашому власному проєкті, та переконайтеся, наскільки вони змінюють ваш API!

Успіхів у кодуванні!

Перекладено з: Making the API Better: Sorting, Limiting Fields, and Pagination in Node.js and MongoDB

Leave a Reply

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