如何关闭 node.js 中的数据库连接?

Var*_*dan 4 javascript node.js

当我在node.js 中关闭数据库连接时出现此错误

Cannot enqueue Query after invoking quit.

这是我的代码

socket.on('adminConnect', function (email) {
    connection = mysql.createConnection(db_config); // db_config has all details of database
    connection.connect(); // no problem in connection
    connection.query("SELECT id FROM user WHERE  email = '" + email + "' ", function (err, results, fields) {
        if (err) throw err;
        if (results[0]) {
            // Some code
            connection.end(); // its giving error "Cannot enqueue Query after invoking quit."
        } else {
            console.log("no id");
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

ran*_*nel 5

通常,您重用连接而不是一直打开/关闭。

要回答您的问题,方法如下:

connection.end();
Run Code Online (Sandbox Code Playgroud)

尝试将该行放在回调之外,因为在结束连接之前所有查询都必须完成,因此您可以像这样安全:

connection.query(.......);
connection.end();
Run Code Online (Sandbox Code Playgroud)

您的代码将是:

socket.on('adminConnect', function (email) {
    connection = mysql.createConnection(db_config); // db_config has all details of database
    connection.connect(); // no problem in connection
    connection.query("SELECT id FROM user WHERE  email = '" + email + "' ", function (err, results, fields) {
        if (err) throw err;
        if (results[0]) {
            // Some code
        } else {
            console.log("no id");
        }
    });
    connection.end();
});
Run Code Online (Sandbox Code Playgroud)

  • 在调用 `connection.end` 之前,你不是在等待 `connection.query` 完成。它应该从 `connection.query` 回调中调用。 (2认同)
  • @robertklep 如果您在做出错误假设之前花时间浏览文档,您会注意到您可能会在触发回调之前调用`.end()`,因为`关闭连接是使用 end() 完成的,这使得确保在向 mysql 服务器发送退出数据包之前执行所有剩余的查询。` - 引自 node-mysql 文档。文档中有一个具有类似代码的示例。https://github.com/felixge/node-mysql#introduction 。关于重用连接,请阅读我的回答中的第一段;) (2认同)
  • @randunel 我真的很抱歉,你确实是对的!我的假设是基于 Node 的一般想法,即您必须在关闭连接等之前等待执行的操作,而 MySQL 在这方面很聪明。所以,再次抱歉! (2认同)