节点Mysql在调用quit后无法排队查询

Kin*_*xit 25 mysql node.js npm express

我在哪里关闭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();
Run Code Online (Sandbox Code Playgroud)

(我是node,npm-express和npm-mysql的初学者.我试过搜索"快速mysql无法入队"来查找相关问题并且没有找到它们.)

unl*_*ted 30

我修复了这个问题使用这个方法.

connection.ndery函数中的connection.end()

固定代码是 here

  • 由于 NodeJS 异步 `connection.end()` 将在执行数据库调用之前触发。 (2认同)

小智 10

如果您正在使用felixgenode-mysql模块,那么您可以在完成所有connection.query()调用后随时调用connection.end(),因为它将等待所有查询完成在它终止连接之前.

有关详细信息,请参阅此处示例.

如果您想要串行运行大量查询,您应该查看异步模块,它非常适合处理一系列异步函数(即那些具有回调的函数).


use*_*723 5

也许问题是由于Node的异步性质,在连接已经关闭之后执行mySQL查询.尝试使用此代码在线程退出之前调用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}));
Run Code Online (Sandbox Code Playgroud)

代码改编自@Emil Condrea,在node.js退出之前执行清理操作