НейроАгент

Полное руководство по параметрам запросов в Express.js

Узнайте, как получать и обрабатывать параметры строки запроса в Express.js с помощью req.query. Это полное руководство охватывает базовый доступ, множественные значения, вложенные параметры и практические примеры для разработчиков Node.js.

Вопрос

Как получить доступ к параметрам строки запроса в Express.js на Node.js?

Как можно извлечь GET-переменные из строки запроса в Express.js, аналогично тому, как работает $_GET в PHP?

Я знаю, что Node.js предоставляет доступ к URL в объекте запроса. Какой правильный метод для извлечения и доступа к параметрам строки запроса в приложениях Express.js?

НейроАгент

Для доступа к параметрам строки запроса в Express.js используется объект req.query, который автоматически анализирует параметры URL-запроса в объект JavaScript, содержащий пары “ключ-значение”. Этот объект доступен в ваших обработчиках маршрутов и предоставляет простой, интуитивно понятный способ получения GET-переменных из URL, аналогично функциональности PHP $_GET.

Содержание

Базовый доступ к параметрам запроса

В Express.js параметры строки запроса автоматически анализируются и становятся доступными через объект req.query в ваших обработчиках маршрутов. Это стандартный и рекомендуемый подход для доступа к GET-переменным.

Пример базового использования:

javascript
const express = require('express');
const app = express();

app.get('/search', (req, res) => {
    // req.query содержит все параметры строки запроса
    const searchTerm = req.query.q;
    const page = req.query.page;
    const limit = req.query.limit;
    
    res.send(`Поиск по: ${searchTerm}, Страница: ${page}, Лимит: ${limit}`);
});

app.listen(3000);

Для URL вида http://localhost:3000/search?q=express&page=2&limit=10 объект req.query будет выглядеть так:

javascript
{
    q: 'express',
    page: '2',
    limit: '10'
}

В документации Express.js подтверждается, что req.query - это свойство, содержащее проанализированные параметры строки запроса.


Обработка нескольких значений и массивов

Express.js автоматически обрабатывает несколько значений для одного параметра запроса, преобразуя их в массивы. Это особенно полезно при работе с флажками или множественным выбором.

Пример нескольких значений:

javascript
app.get('/colors', (req, res) => {
    // Если URL: /colors?color=red&color=blue&color=green
    // req.query будет: { color: ['red', 'blue', 'green'] }
    
    const colors = req.query.color;
    console.log(Array.isArray(colors)); // true
    
    res.json({
        colors: colors,
        count: colors.length
    });
});

Вы также можете вручную обрабатывать массивы, используя разные синтаксисы:

Синтаксис с квадратными скобками:

javascript
// URL: /items?ids[]=1&ids[]=2&ids[]=3
// req.query: { ids: ['1', '2', '3'] }

Значения, разделенные запятыми:

javascript
app.get('/tags', (req, res) => {
    // URL: /tags?tags=javascript,nodejs,express
    const tags = req.query.tags.split(',');
    // tags становится: ['javascript', 'nodejs', 'express']
});

Как объясняется на Stack Overflow, при использовании одного и того же параметра несколько раз Express автоматически создает массив.


Вложенные параметры и расширенные возможности

Express.js поддерживает вложенные параметры запроса с использованием скобочной нотации, что полезно для сложных структур данных.

Пример вложенных параметров:

javascript
app.get('/product', (req, res) => {
    // URL: /product?shoe[color]=blue&shoe[size]=42&shirt[color]=red
    // req.query будет:
    // {
    //     'shoe[color]': 'blue',
    //     'shoe[size]': '42',
    //     'shirt[color]': 'red'
    // }
    
    const shoeColor = req.query['shoe[color]'];
    const shirtColor = req.query['shirt[color]'];
    
    res.json({
        shoe: { color: shoeColor },
        shirt: { color: shirtColor }
    });
});

Пример фильтрации с массивами:

javascript
app.get('/apples', (req, res) => {
    // URL: /apples?filterBy=Empire&filterBy=Granny%20Smith
    // req.query: { filterBy: ['Empire', 'Granny Smith'] }
    
    const apples = [
        { type: 'Empire', price: '$1.20', quantity: 10 },
        { type: 'Granny Smith', price: '$0.85', quantity: 8 },
        { type: 'Gala', price: '$0.98', quantity: 4 }
    ];
    
    const { filterBy = [] } = req.query;
    const filteredApples = apples.filter(apple => 
        filterBy.includes(apple.type)
    );
    
    res.json(filteredApples);
});

Согласно Mastering JS, когда параметр запроса появляется несколько раз, Express автоматически группирует значения в массив, что упрощает работу с множественным выбором.


Параметры конфигурации парсера запросов

Express.js позволяет настраивать, как анализируются строки запроса, предоставляя гибкость в обработке разных форматов параметров.

Пример конфигурации:

javascript
const express = require('express');
const app = express();

// Настройка парсера запросов
app.set('query parser', 'simple'); // По умолчанию: 'extended'
app.set('query parser fn', (str) => {
    // Пользовательская функция парсинга запросов
    return require('qs').parse(str);
});

app.get('/configured', (req, res) => {
    // Пользовательское поведение парсинга
    res.json(req.query);
});

Типы парсеров:

  • 'simple': Парсит строку запроса в простые пары “ключ-значение”
  • 'extended': Позволяет вложенные объекты и массивы (по умолчанию)

Полные практические примеры

Ниже приведены несколько полных примеров, демонстрирующих работу с параметрами запроса в реальных сценариях.

Пример приложения поиска:

javascript
const express = require('express');
const app = express();

app.get('/search', (req, res) => {
    const { q, page = '1', limit = '10', sort = 'relevance' } = req.query;
    
    // Валидация ввода
    if (!q) {
        return res.status(400).json({ error: 'Поисковый запрос обязателен' });
    }
    
    // Преобразование в числа
    const pageNum = parseInt(page, 10);
    const limitNum = parseInt(limit, 10);
    
    // Бизнес-логика
    const searchResults = [
        { id: 1, title: 'Учебник по Express.js', relevance: 0.95 },
        { id: 2, title: 'Лучшие практики Node.js', relevance: 0.88 },
        { id: 3, title: 'Веб-разработка с Express', relevance: 0.82 }
    ];
    
    // Сортировка результатов
    const sortedResults = [...searchResults].sort((a, b) => {
        if (sort === 'relevance') {
            return b.relevance - a.relevance;
        }
        return a.title.localeCompare(b.title);
    });
    
    // Пагинация результатов
    const startIndex = (pageNum - 1) * limitNum;
    const endIndex = startIndex + limitNum;
    const paginatedResults = sortedResults.slice(startIndex, endIndex);
    
    res.json({
        query: q,
        page: pageNum,
        limit: limitNum,
        total: sortedResults.length,
        results: paginatedResults
    });
});

app.listen(3000, () => {
    console.log('Поисковое приложение запущено на порту 3000');
});

Пример фильтрации и сортировки API:

javascript
app.get('/api/products', (req, res) => {
    const {
        category,
        minPrice,
        maxPrice,
        inStock,
        sortBy = 'name',
        sortOrder = 'asc'
    } = req.query;
    
    // Фильтрация продуктов
    let filteredProducts = allProducts.filter(product => {
        if (category && product.category !== category) return false;
        if (minPrice && product.price < parseFloat(minPrice)) return false;
        if (maxPrice && product.price > parseFloat(maxPrice)) return false;
        if (inStock && product.inStock !== (inStock === 'true')) return false;
        return true;
    });
    
    // Сортировка продуктов
    filteredProducts.sort((a, b) => {
        const modifier = sortOrder === 'desc' ? -1 : 1;
        if (sortBy === 'price') {
            return (a.price - b.price) * modifier;
        }
        return a[sortBy].localeCompare(b[sortBy]) * modifier;
    });
    
    res.json({
        total: filteredProducts.length,
        products: filteredProducts.slice(0, 20) // Ограничение первыми 20 результатами
    });
});

Источники

  1. Stack Overflow - Как получить GET (параметры строки запроса) переменные в Express.js на Node.js?
  2. Stack Abuse - Получение строк запроса и параметров в Express.js
  3. Better Stack Community - Как получить GET переменные в Express.js на Node.js?
  4. Tutorialspoint - Получение переменных строки запроса в Express.js
  5. Flavio Copes - Получение GET переменных запроса с помощью Express
  6. Sentry - Доступ к GET параметрам в Express на Node.js
  7. Mastering JS - Параметры запроса в Express
  8. GeeksforGeeks - Различие между req.query и req.params в Express
  9. DEV Community - Express: req.params, req.query и req.body
  10. Derek Hassan - Как передать массив как строку запроса в Express

Заключение

Доступ к параметрам строки запроса в Express.js осуществляется с помощью объекта req.query, который предоставляет мощный и гибкий способ работы с GET-переменными. Ключевые выводы включают:

  • Используйте req.query для доступа ко всем параметрам строки запроса как к объекту
  • Express автоматически обрабатывает несколько значений, преобразуя их в массивы
  • Вложенные параметры работают с использованием скобочной нотации, например param[key]=value
  • Вы можете настроить парсер запросов для разных поведений парсинга
  • Всегда валидируйте и очищайте параметры запроса перед использованием их в логике вашего приложения

Следуя этим практикам, вы можете эффективно обрабатывать параметры запроса в ваших приложениях Express.js, предоставляя пользователям интуитивные возможности фильтрации, поиска и извлечения данных на основе URL, аналогично тому, что вы можете найти в традиционных PHP-приложениях.