Подтвердить что ты не робот

Node Mysql Не удается выполнить запрос после вызова quit

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

4b9b3361

Ответ 1

Я исправил эту проблему, используя этот метод.

connection.end() в вашей функции connection.query

Фиксированный код here

Ответ 2

Если вы используете node -mysql модуль felixge, вы можете вызвать connection.end() в любой момент после того, как вы сделали все вызовы connection.query(), так как он будет ждать завершения всех запросов до того, как он завершит соединение.

Подробнее см. здесь.

Если вы хотите запускать множество запросов последовательно, вы должны заглянуть в модуль async, он отлично подходит для работы с серией асинхронных функций (т.е. тех, у которых есть обратный вызов).

Ответ 3

Возможно, проблема в том, что запрос 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 завершает

Ответ 4

В моем случае connection.end вызывался в месте, которое было трудно заметить, поэтому ошибочный вызов connection.end может быть проблемой с этой ошибкой