Как отправить и отрендерить больше 1 запрос к mysql на node.js express?
Всем привет! Недавно начал изучение node.js и написал небольшой проект с базой данных пользователей. Сейчас столкнулся с тем, что не могу на одной странице отрендерить больше одной группы (таблицы) пользователей.
У пользователя в таблице стоит либо one либо two, через запрос к sql я делаю выборку и вывожу только эту группу. С выводом одной группы нет никаких проблем, а вот вторую - никак. Сижу третий день, примеры из инета не подходят.
Рендер происходит на странице handlebars, запрос уже ковырял со всех сторон.
Код шаблона hbs:
<div class=""> <h1>All groups</h1> </div> <hr> <div class="row"> <table class="table table-bordered"> <thead class="table-dark"> <tr> <th scope="col">#</th> <th scope="col">First Name</th> <th scope="col">Last Name</th> <th scope="col">Phone</th> <th scope="col" class="text-end">Action</th> </tr> </thead> <tbody> {{#each rows}} <tr> <th scope="row">{{this.id}}</th> <td>{{this.first_name}}</td> <td>{{this.last_name}}</td> <td>{{this.phone}}</td> <td class="text-end"> <a href="/viewuser/{{this.id}}" type="button" class="btn btn-outline-primary btn-sm"><i class="bi bi-eye"></i></a> <a href="/edituser/{{this.id}}" type="button" class="btn btn-light btn-sm"><i class="bi bi-pencil"></i></a> <a href="/{{this.id}}" type="button" class="btn btn-danger btn-sm"><i class="bi bi-trash"></i></a> </td> </tr> {{/each}} </tbody> </table> </div> <div class="row"> <table class="table table-bordered"> <thead class="table-dark"> <tr> <th scope="col">#</th> <th scope="col">First Name</th> <th scope="col">Last Name</th> <th scope="col">Phone</th> <th scope="col" class="text-end">Action</th> </tr> </thead> <tbody> {{#each rows2}} <tr> <th scope="row">{{this.id}}</th> <td>{{this.first_name}}</td> <td>{{this.last_name}}</td> <td>{{this.phone}}</td> <td class="text-end"> <a href="/viewuser/{{this.id}}" type="button" class="btn btn-outline-primary btn-sm"><i class="bi bi-eye"></i></a> <a href="/edituser/{{this.id}}" type="button" class="btn btn-light btn-sm"><i class="bi bi-pencil"></i></a> <a href="/{{this.id}}" type="button" class="btn btn-danger btn-sm"><i class="bi bi-trash"></i></a> </td> </tr> {{/each}} </tbody> </table> </div> |
<div class=""> <h1>All groups</h1> </div> <hr> <div class="row"> <table class="table table-bordered"> <thead class="table-dark"> <tr> <th scope="col">#</th> <th scope="col">First Name</th> <th scope="col">Last Name</th> <th scope="col">Phone</th> <th scope="col" class="text-end">Action</th> </tr> </thead> <tbody> {{#each rows}} <tr> <th scope="row">{{this.id}}</th> <td>{{this.first_name}}</td> <td>{{this.last_name}}</td> <td>{{this.phone}}</td> <td class="text-end"> <a href="/viewuser/{{this.id}}" type="button" class="btn btn-outline-primary btn-sm"><i class="bi bi-eye"></i></a> <a href="/edituser/{{this.id}}" type="button" class="btn btn-light btn-sm"><i class="bi bi-pencil"></i></a> <a href="/{{this.id}}" type="button" class="btn btn-danger btn-sm"><i class="bi bi-trash"></i></a> </td> </tr> {{/each}} </tbody> </table> </div> <div class="row"> <table class="table table-bordered"> <thead class="table-dark"> <tr> <th scope="col">#</th> <th scope="col">First Name</th> <th scope="col">Last Name</th> <th scope="col">Phone</th> <th scope="col" class="text-end">Action</th> </tr> </thead> <tbody> {{#each rows2}} <tr> <th scope="row">{{this.id}}</th> <td>{{this.first_name}}</td> <td>{{this.last_name}}</td> <td>{{this.phone}}</td> <td class="text-end"> <a href="/viewuser/{{this.id}}" type="button" class="btn btn-outline-primary btn-sm"><i class="bi bi-eye"></i></a> <a href="/edituser/{{this.id}}" type="button" class="btn btn-light btn-sm"><i class="bi bi-pencil"></i></a> <a href="/{{this.id}}" type="button" class="btn btn-danger btn-sm"><i class="bi bi-trash"></i></a> </td> </tr> {{/each}} </tbody> </table> </div>
Код JS, в котором удалось реализовать один запрос:
// Все группы exports.gr = (req, res) => { pool.getConnection((err, connection) => { //коннект к бд if (err) throw err; // не удалось подключиться console.log("Connected as ID " + connection.threadId); // коннект к таблице sql connection.query( 'SELECT * FROM users WHERE gr = "one"', (err, rows) => { if (!err) { let filterOne = req.query.one; res.render('gr', { rows, filterOne}); } else { console.log(err); } console.log("The data from user table: n", rows); } ); }); }; |
// Все группы exports.gr = (req, res) => { pool.getConnection((err, connection) => { //коннект к бд if (err) throw err; // не удалось подключиться console.log("Connected as ID " + connection.threadId); // коннект к таблице sql connection.query( 'SELECT * FROM users WHERE gr = "one"', (err, rows) => { if (!err) { let filterOne = req.query.one; res.render('gr', { rows, filterOne}); } else { console.log(err); } console.log("The data from user table: n", rows); } ); }); };
пытался по-разному, ничего не срабатывает, все крашится. Видимо совсем не в ту сторону копаю. Если подскажите или скините, что почитать, буду благодарен.
Визуально приложение выглядит так.
По сути я хочу также в rows отображать пользователей с параметром one, а в rows2 - с параметром two. Но получается только или первых или вторых.
Дополнительно:
Ну сам подумай - а где у тебя передаётся второй набор записей, набор, полученный выполнением второго запроса? Твой рендер-код тупо работает с данными (если я верно понял показанный код - ни хрена не смыслю в этом) из {{this.column_name}}, а там лежит только первый рекордсет.
Так что вместо this тебе нужно нечто более объемлющее, не набор записей, а коллекция наборов.
Ну или альтернативно - код получения набора записей должен быть тогда не чёрт те где, а непосредственно перед кодом отрисовки. И снаружи код отрисовки будет получать не готовый набор записей, а только набор параметров для получения этого набора.
Это чисто идеологически. Как это превращать в рабочий код - не ко мне...
Что ж, второй раз я тут задал вопрос и второй раз сам же нашел решение. Оно удивительно простое, возможно кому-то пригодиться.
// Все группы exports.gr = (req, res) => { pool.getConnection((err, connection) => { //коннект к бд if (err) throw err; // не удалось подключиться console.log("Connected as ID " + connection.threadId); // коннект к таблице sql // connection.query( // 'SELECT * FROM users WHERE gr = "one"', // (err, rows) => { // if (!err) { // let filterOne = req.query.one; // res.render('gr', { rows, filterOne}); // } else { // console.log(err); // } // console.log("The data from user table: n", rows); // } // ); connection.query('SELECT * FROM users WHERE gr = "one"', function(err, rows) { connection.query( 'SELECT * FROM users WHERE gr = "two"', function(err, rows2) { res.render('gr', { rows : rows, rows2: rows2 }); }); }); }); }; |
// Все группы exports.gr = (req, res) => { pool.getConnection((err, connection) => { //коннект к бд if (err) throw err; // не удалось подключиться console.log("Connected as ID " + connection.threadId); // коннект к таблице sql // connection.query( // 'SELECT * FROM users WHERE gr = "one"', // (err, rows) => { // if (!err) { // let filterOne = req.query.one; // res.render('gr', { rows, filterOne}); // } else { // console.log(err); // } // console.log("The data from user table: n", rows); // } // ); connection.query('SELECT * FROM users WHERE gr = "one"', function(err, rows) { connection.query( 'SELECT * FROM users WHERE gr = "two"', function(err, rows2) { res.render('gr', { rows : rows, rows2: rows2 }); }); }); }); };
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для отправки и отрисовки больше одного запроса к MySQL на Node.js Express необходимо использовать асинхронные запросы и правильно управлять последовательностью выполнения операций.
Прежде всего, необходимо подключить к проекту библиотеку mysql, которая позволит взаимодействовать с базой данных. Для этого можно использовать пакет npm mysql. После установки пакета необходимо создать подключение к базе данных и настроить его параметры, такие как хост, пользователь, пароль и имя базы данных.
Для отправки запросов к базе данных на Node.js Express можно использовать методы библиотеки mysql, такие как query или execute. Эти методы позволяют отправить SQL-запрос к базе данных и получить результат в виде колбэка или промиса.
Для отправки нескольких запросов к базе данных можно использовать циклы или методы Promise.all или async/await. Например, можно создать массив с несколькими SQL-запросами и последовательно пройти по нему, отправляя каждый запрос к базе данных.
Также можно использовать асинхронные функции и методы библиотеки mysql, которые позволяют отправлять несколько запросов параллельно и дожидаться их выполнения. Это позволяет ускорить выполнение операций с базой данных и улучшить производительность приложения.
Важно помнить о безопасности при работе с базой данных и использовать параметризованные запросы для предотвращения SQL-инъекций. Также следует правильно обрабатывать ошибки и исключения при выполнении запросов к базе данных, чтобы избежать возможных проблем и утечек информации.
В итоге, отправка и отрисовка больше одного запроса к MySQL на Node.js Express требует использования асинхронных методов и управления последовательностью выполнения операций, чтобы обеспечить эффективную работу приложения и безопасность данных.