Ответ 1
Я исправил эту проблему, используя этот метод.
connection.end() в вашей функции connection.query
Фиксированный код here
где я могу закрыть соединение mysql?
Мне нужно запускать запросы в последовательности. Я пишу код, который выглядит следующим образом:
var sqlFindMobile = "select * from user_mobiles where mobile=?";
var sqlNewUser = "insert into users (password) values (?)";
//var sqlUserId = "select last_insert_id() as user_id";
var sqlNewMobile = "insert into user_mobiles (user_id, mobile) values (?,?)";
connection.connect(function(err){});
var query = connection.query(sqlFindMobile, [req.body.mobile], function(err, results) {
if(err) throw err;
console.log("mobile query");
if(results.length==0) {
var query = connection.query(sqlNewUser, [req.body.password], function(err, results) {
if(err) throw err;
console.log("added user");
var user_id = results.insertId;
var query = connection.query(sqlNewMobile, [user_id, req.body.mobile], function(err, results) {
if(err) throw err;
console.log("added mobile");
//connection.end();
});
});
}
});
//connection.end();
(Я начинаю с node, npm-express и npm-mysql. Я пробовал искать SO для того, чтобы "экспресс-mysql не мог ставить в очередь", чтобы найти связанные вопросы и не нашел их.)
Я исправил эту проблему, используя этот метод.
connection.end() в вашей функции connection.query
Фиксированный код here
Если вы используете node -mysql модуль felixge, вы можете вызвать connection.end() в любой момент после того, как вы сделали все вызовы connection.query(), так как он будет ждать завершения всех запросов до того, как он завершит соединение.
Подробнее см. здесь.
Если вы хотите запускать множество запросов последовательно, вы должны заглянуть в модуль async, он отлично подходит для работы с серией асинхронных функций (т.е. тех, у которых есть обратный вызов).
Возможно, проблема в том, что запрос mySQL выполняется после того, как соединение уже закрыто из-за асинхронного характера Node. Попробуйте использовать этот код для вызова connection.end() прямо перед выходом потока:
function exitHandler(options, err) {
connection.end();
if (options.cleanup)
console.log('clean');
if (err)
console.log(err.stack);
if (options.exit)
process.exit();
}
//do something when app is closing
process.on('exit', exitHandler.bind(null, {cleanup: true}));
Код, адаптированный из @Emil Condrea, выполняющий операцию очистки непосредственно перед Node.js завершает
В моем случае connection.end вызывался в месте, которое было трудно заметить, поэтому ошибочный вызов connection.end может быть проблемой с этой ошибкой