it-swarm.com.ru

Узел 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 «express mysql enqueue», чтобы найти связанные вопросы, и не нашел их.)

22
Kinjal Dixit

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

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

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

25
unlimited

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

Смотрите пример здесь для получения дополнительной информации.

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

10
matthewtole

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

5
user3413723

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

1
Kyle Roux