Отрисовка нескольких запросов в Node Express

Я работаю с Node.js (экспресс) и MySQL, и у меня возникли проблемы с попыткой сделать несколько запросов по одному и тому же маршруту. Выдает следующую ошибку:

Can't set headers after they are sent.

И мой код такой:

router.post('/test', function (req, res, next){
db.query("select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where 
TABLE_NAME = 'registros';", function (error, results, fields) {

if (error) throw error;
res.render('test', {
columnNames: results
});});
db.query("SELECT * FROM registros", function (error, resp, fields) {

if (error) throw error;
res.render('test', {
dataRegistros: resp
});});

});

Я понимаю, что это может быть потому, что он выполняется дважды по одному и тому же маршруту. Каким будет правильный способ сделать несколько SQL-запросов и вернуть их в видимый файл?

С Уважением!

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
2 783
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Согласно драйвер mysql nodejs вы можете настроить его для объединения запросов и возврата массива с результатами

Вы должны установить это при создании соединения:

mysql.createConnection({multipleStatements: true});

Затем сделайте запрос с обоими запросами

router.post('/test', function (req, res, next) {

  var queries = [
    "select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'registros'",
    "SELECT * FROM registros"
  ];

  db.query(queries.join(';'), function (error, results, fields) {

    if (error) throw error;

    res.render('test', {
      columnNames: results[0], // First query from array
      dataRegistros: resp      // Second query from array
    });

  });

});

Но позвольте мне задать вопрос, зачем вам запрашивать имена столбцов, когда на самом деле вы запрашиваете все строки и можете получать столбцы оттуда?

Привет. Причина, по которой я это сделал, была ... просто чтобы поэкспериментировать! Я спросил себя, что произойдет, если мне нужно будет сделать несколько запросов по одному маршруту и ​​отправить их. Я хотел заполнить таблицу html, сначала получив имена столбцов, а затем всю запись для тела таблицы. Спасибо, попробую то, что вы предложили!

Kryphon 09.09.2018 16:50

Чтобы сделать несколько запросов из одного маршрута, используйте асинхронная библиотека npm

npm install --save async

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

async.parallel({
   one: function(callback) {
      callback(null, 'abc\n');
   },
   two: function(callback) {
     callback(null, 'xyz\n');
   }
}, function(err, results) {
    if (error) throw error;
      res.render('test', {
        columnNames: results.one, 
        dataRegistros: results.two      
     });
});

Другие вопросы по теме