Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Динамическое формирование SQL запроса REST API (https://javascript.ru/forum/node-js-io-js/84483-dinamicheskoe-formirovanie-sql-zaprosa-rest-api.html)

Elfix 26.09.2022 21:49

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

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

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

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


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

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

Как это можно сделать наиболее простым способом?

Elfix 26.09.2022 22:27

Нашел решение через 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-инъекций?

ksa 26.09.2022 22:27

Цитата:

Сообщение от Elfix
Как это можно сделать наиболее простым способом?

Для начала просто возьми свои параметры... Напиши рядом какой запрос должен получиться в итоге...

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

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


Часовой пояс GMT +3, время: 03:39.