27

我在哪里关闭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 的初学者。我尝试过搜索“express mysql cannot enqueue”以查找相关问题,但没有找到。)

4

4 回答 4

34

我用这个方法解决了这个问题:

connection.end()在你的connection.query功能中

固定代码是here

于 2013-03-07T09:11:45.927 回答
11

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

有关更多信息,请参见此处的示例。

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

于 2013-01-15T11:47:11.713 回答
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}));

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

于 2015-07-16T13:03:34.023 回答
1

在我的例子中,connection.end 在一个很难注意到的地方被调用,所以对 connection.end 的错误调用可能是这个错误的问题

于 2017-09-16T19:00:56.407 回答