Как отправить и отрендерить больше 1 запрос к mysql на node.js express?

Ссылка скопирована
1 ответ

Всем привет! Недавно начал изучение 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); } ); }); };

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

Визуально приложение выглядит так.

Как отправить и отрендерить больше 1 запрос к mysql на node.js express?

По сути я хочу также в 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 }); }); }); }); };

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

Для отправки и отрисовки больше одного запроса к 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 требует использования асинхронных методов и управления последовательностью выполнения операций, чтобы обеспечить эффективную работу приложения и безопасность данных.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно