Мануал по mysql https://github.com/mysqljs
При разработке приложения на стеке JS + NODE.js + Express + MySQL2 столкнулся с тем, что запрос, сформированного с помощью pool.query(), зависит от синтаксиса, а именно - от правильности указания в запросе кавычек ( или ' или "
).
Кавычка это служебный символ языка SQL. Она отвечает за отметку начала и конца строки. Если кавычку нужно записать как часть строки ее нужно экранировать \".
Итак:
- обратные кавычки` используются тогда, когда необходимо экранировать название столбца (если оно совпадает с зарезервированным ключевым словом);
- 'одинарные кавычки' следует использовать для даты и строки;
- "двойные кавычки" следует использовать для написания непосредственно запроса.
Путем проб и ошибок пришел к выводу, что правильные кавычки необходимо указывать непосредственно в строке запроса (в том числе, с использованием экранирования обратным слэшем - \), так как их передача в функцию в строке аргумента приводила к некорректной работе запроса (запрос отрабатывал, но возвращал неправильные или неполные значения - хотя, может это и моя невнимательность...).
Пример формирования рабочего JS запроса к mySQL:
для простоты опустил некоторые вещи в коде (например, обработку ошибок)
Файл конфигурации соединения с базой данных mySQL (файл bd.config.js):
1 2 3 4 5 6 7 8 9 |
const config = { host: "xx1234.beget.tech", user: "xx1234_abcd", password: "password", database: "databaseName", port: "3306", }; export default config; |
Установка пула соединений с mySQL (файл bd.connection.js):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import dbConfig from "../../config/bd.config.js"; import mysql from "mysql2"; let connectPool = mysql .createPool({ connectionLimit: 5, host: dbConfig.host, user: dbConfig.user, password: dbConfig.password, database: dbConfig.database, }) .promise(); export default connectPool; |
Роутер, получающий результат запроса к mySQL:
обратите внимание на внутренние кавычки во втором аргументе функции getSearchData()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import { Router } from "express"; import { getSearchData } from "../helpers/getDataFromDatabase.js"; const routerSearchWork = new Router(); let resultSearchData = "", searchWord = ""; routerSearchWork.route("/search-work").post((req, res) => { if (!req.body) return res.sendStatus(400); searchWord = JSON.parse(req.body); console.log("searchWord", searchWord); getSearchData( "service_element", "service_element_id`,`services_id`,`service_element_name", "service_element_name", searchWord ).then((result) => { // ... обработка результата, возвращенного функцией getSearchData() ... resultSearchData = result[0]; console.log("result", resultSearchData); res.send(resultSearchData); }); }); export { routerSearchWork }; |
Функция запроса SELECT с LIKE к mySQL:
обратите внимание на экранирование внешних кавычек в аргументе query() и кавычки вокруг %${searchWord}%
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import connectPool from "./bd.connection.js"; async function getSearchData(tableName, allColumnName, columnNameToSearch, searchWord) { let arrSearchDataList; await connectPool .query(`SELECT `${allColumnName}` FROM ${tableName} WHERE `${columnNameToSearch}` LIKE "%${searchWord}%"`) .then((result) => { arrSearchDataList = result; // ... обработка результата запроса ... }); return arrSearchDataList; } |
Для защиты от SQL-инъекций в тексте запроса используйте плейсхолдеры ? и ??.
Например:
1 |
.query(`SELECT `${allColumnName}` FROM ?? WHERE ?? LIKE "%${searchWord}%"`,[tableName,columnNameToSearch]) |
?? - используется для имен таблиц и столбцов (он отделяется от них обратными кавычками);
? - для других значений.