Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.09.2022, 21:49
Аспирант
Отправить личное сообщение для Elfix Посмотреть профиль Найти все сообщения от Elfix
 
Регистрация: 03.01.2018
Сообщений: 38

Динамическое формирование SQL запроса REST API
Приветствую!

Работаю с Node.JS. Для подключения к базе данных на Postgresql использую pg-promise.

В GET запрос в параметрах приходит вот такая структура:

{
  orderBy: { first_name: 'asc', last_name: 'desc' },
  filters: { last_name: 'Albert A' }
}


Полей для фильтров (как и для сортировки) может быть больше, т. е. это структура формируется динамически.

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

Как это можно сделать наиболее простым способом?
Ответить с цитированием
  #2 (permalink)  
Старый 26.09.2022, 22:27
Аспирант
Отправить личное сообщение для Elfix Посмотреть профиль Найти все сообщения от Elfix
 
Регистрация: 03.01.2018
Сообщений: 38

Нашел решение через squel

const validKeys = ['firstName', 'lastName', 'patronymic', 'birthday', 'gender', 'email'];

    let orderBy = request.query.orderBy;
    let filters = request.query.filters;

    Object.keys(orderBy).forEach((key) => validKeys.includes(key) || delete orderBy[key]);
    orderBy = snakecaseKeys(orderBy);

    Object.keys(filters).forEach((key) => validKeys.includes(key) || delete filters[key]);
    filters = snakecaseKeys(filters);

    let query = squel.select()
        .field('id')
        .field('display_name')
        .from('people');

    Object.keys(filters).forEach((key) => {
        query = query.where(`${key.toString()} = '${filters[key]}'`);
    });

    Object.keys(orderBy).forEach((key) => {
        query = query.order(key.toString(), orderBy[key].toLowerCase() === 'asc');
    });

    query = query.toParam();

    console.log(query.text);


Насколько хорошо это с точки зрения SQL-инъекций?
Ответить с цитированием
  #3 (permalink)  
Старый 26.09.2022, 22:27
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от Elfix
Как это можно сделать наиболее простым способом?
Для начала просто возьми свои параметры... Напиши рядом какой запрос должен получиться в итоге...

Если понимание не пришло сразу - возьми еще, другой набор параметров... И снова напиши какой запрос должен получиться...

Т.е. ты просто должен научиться делать текстовую строку из полученных данных.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
REST API: список стран на разных языках Elfix Элементы интерфейса 0 16.10.2021 00:01
REST API Проектирование путей запроса Elfix Node.JS 10 13.10.2021 17:30
REST API для сайта на Node js Ashotich Node.JS 2 26.09.2016 23:04
Прошу раскритиковать наслойку работы с MySql. Alasdair Node.JS 4 21.11.2015 20:06
rest api client z2312 AJAX и COMET 0 20.01.2015 11:53