Nodejs连接mysql查询报错Cannot enqueue quit after invoking quit

Nodejs连接mysql查询报错Cannot enqueue quit after invoking quit

exports.user_info_getinfo = function(user_id, callback){
	client.connect(function(err){
		if(err){
			callback(err);
			client.end();
			return;
		}
		client.query(“use koc_share_user;”);
		client.query(“select * from user_info where user_id = ?”,
			[user_id],
			function(err, result){
				if(err){
					callback(err);
				}else{
					callback(result);
				}
				client.end();
			}
		);
	});
}

以上是代码,这个方法是获取单个用户信息,当我第一次访问ID为1000的用户时没问题,但是当我访问1001的用户时,就会报错Cannot enqueue quit after invoking quit.貌似是连接已经关闭了,不知道有没有什么好的解决办法??


9 回复

exports.user_info_getinfo = function(user_id, callback){ client.connect(function(err){ if(err){ callback(err); client.end(); return; } client.query(“use koc_share_user;”); client.query(“select * from user_info where user_id = ?”, [user_id], function(err, result){ if(err){ callback(err); }else{ callback(result); } client.end(); } ); }); }

以上是代码,这个方法是获取单个用户信息,当我第一次访问ID为1000的用户时没问题,但是当我访问1001的用户时,就会报错Cannot enqueue quit after invoking quit.貌似是连接已经关闭了,不知道有没有什么好的解决办法??


哦 谢谢 我试试easymysql

Node.js 连接 MySQL 查询报错 Cannot enqueue quit after invoking quit

问题描述

在使用 Node.js 连接 MySQL 数据库时,如果你尝试多次执行数据库查询操作,并且在每次查询后立即关闭连接,可能会遇到错误 Cannot enqueue quit after invoking quit。这个问题通常发生在你试图在一个已经关闭的连接上执行新的查询或关闭操作。

示例代码分析

以下是原始代码:

exports.user_info_getinfo = function(user_id, callback) {
    client.connect(function(err) {
        if (err) {
            callback(err);
            client.end();
            return;
        }
        client.query("use koc_share_user;");
        client.query("select * from user_info where user_id = ?",
            [user_id],
            function(err, result) {
                if (err) {
                    callback(err);
                } else {
                    callback(result);
                }
                client.end();
            }
        );
    });
};

问题所在

在这个代码中,每次调用 user_info_getinfo 函数时,都会重新连接数据库并执行查询。查询完成后立即关闭连接。当第二次调用该函数时,由于前一次查询已经关闭了连接,所以再次执行查询时会抛出 Cannot enqueue quit after invoking quit 错误。

解决方案

为了修复这个问题,可以考虑以下几种方法:

  1. 复用数据库连接: 不要在每次查询时都重新连接和关闭数据库。可以创建一个全局的数据库连接对象,在整个应用生命周期内复用它。

  2. 使用连接池: 使用连接池来管理数据库连接,这样可以在多个请求之间共享连接,提高性能和稳定性。

下面是使用连接池的示例代码:

const mysql = require('mysql');
const pool = mysql.createPool({
    host: 'localhost',
    user: 'your_username',
    password: 'your_password',
    database: 'koc_share_user'
});

exports.user_info_getinfo = function(user_id, callback) {
    pool.getConnection(function(err, connection) {
        if (err) {
            callback(err);
            return;
        }
        connection.query("select * from user_info where user_id = ?", [user_id], function(err, result) {
            connection.release(); // 释放连接到连接池
            if (err) {
                callback(err);
            } else {
                callback(result);
            }
        });
    });
};

解释

  • 创建连接池:通过 mysql.createPool 创建一个连接池。
  • 获取连接:在每次查询时从连接池中获取一个连接。
  • 执行查询:执行查询后,使用 connection.release() 将连接释放回连接池,而不是直接关闭连接。
  • 错误处理:如果在获取连接或执行查询过程中发生错误,则调用回调函数返回错误。

通过这种方式,你可以避免频繁地创建和销毁连接,从而避免 Cannot enqueue quit after invoking quit 错误。

[@dfsk64](/user/dfsk64)我想问下,我遇到类似问题,你这个问题现在解决了么

[@iLolita](/user/iLolita) 后来用了easymysql 可以解决

mysql.addserver({ ‘host’ : ‘localhost’, ‘user’ : ‘root’, ‘password’ : ‘root’ }); 如何指定数据库?

你可以一开始就连接mysql 然后不断开,一直连着,以后就不连接,这样就不会错了,连着2次connect 或 end 都会报错

从你提供的代码来看,问题出在 client.end() 被调用了多次。每次调用 client.end() 后,MySQL客户端对象就进入了结束状态,不能再执行任何查询或结束操作。因此,在第二次访问用户时,client.end() 已经被调用过,再次调用它会触发错误 Cannot enqueue quit after invoking quit

解决这个问题的方法是不要在每个查询之后都调用 client.end()。你可以在所有需要的操作完成之后再调用一次 client.end() 来关闭数据库连接。以下是一个修改后的示例:

const mysql = require('mysql');

let client;

function connectDB() {
    if (!client) {
        client = mysql.createConnection({
            host: 'localhost',
            user: 'yourusername',
            password: 'yourpassword',
            database: 'koc_share_user'
        });
        client.connect((err) => {
            if (err) {
                console.error('Error connecting to MySQL:', err);
                return;
            }
            console.log('Connected to MySQL database!');
        });
    }
}

exports.user_info_getinfo = function(user_id, callback) {
    connectDB();

    client.query("select * from user_info where user_id = ?", [user_id], (err, result) => {
        if (err) {
            callback(err);
        } else {
            callback(null, result); // 返回查询结果
        }
    });
};

// 在所有操作完成后关闭连接
process.on('exit', () => {
    if (client) {
        client.end(() => {
            console.log('Database connection closed.');
        });
    }
});

在这个修改后的版本中,我们只在需要的时候建立一次数据库连接,并在程序退出前确保关闭该连接。这样可以避免重复调用 client.end() 导致的错误。

回到顶部