Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Node.js Последовательные взаимозависимые запросы mysql

Проблема с Node.js и MySQL Появилась необходимость связать несколько запросов, причем последующие будут зависеть от результатов предыдущих. Как пример взял обычные 2 запроса на селект, не могу связать. Первый запрос срабатывает, а на второй валит ошибку
Error2 Cannot enqueue Query after invoking quit.
Подскажите в чем завтык, почему не хочет вызывать второй вложенный запрос?
var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : '', database : 'test' }); connection.query('SELECT * from testtable', function(err, rows, fields) { if (!err){ console.log('Первый запрос: '+rows); connection.query('SELECT * from secondtable', function(err2, rows2, fields2) { if (!err2){ console.log('Второй запрос: '+rows2); }else{ console.log('Error2 '+err2); } }); }else{ console.log('Error1 '+err2); } });


Ответ

Необходимо было удалить connection.end() после первого connection.query()
Если это сервер, который крутиться "вечно" то самый простой вариант - держать коннект постоянно. Более сложное, но правильное решение - использовать пул подключений, который будут закрываться сами при простое.
Ну и если подключение нужно редко - лучше сделать открытие соединения по необходимости, выполнение запросов, а после выполнения всех - закрыть.
Если взять Ваш случай (2 запроса), считаем, что их нужно один раз выполнить и забыть - я бы написал как-то так:
var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'test' }); connection.query('SELECT * from testtable', function(err, rows, fields) { if (err) { console.error('Error1', err); return connection.end(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } console.log('Первый запрос:', rows); connection.query('SELECT * from secondtable', function(err, rows2, fields2) { connection.end(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if (!err) { return console.error('Error2', err); } console.log('Второй запрос: ' + rows2); }); });
Но куда конкретно вставить закрытие соединения - лучше нормально продумать.
П.С. Возможно Вы плохо знакомы с асинхронностью в node.js. Если так - почитайте на эту тему.

Комментариев нет:

Отправить комментарий