Nodejs node + mysql 报错 error Cannot enqueue Quit after invoking quit

Nodejs node + mysql 报错 error Cannot enqueue Quit after invoking quit

var db_options={ host:‘localhost’, port : 3308, user : ‘root’, password : ‘’, database:‘mysql’ } var mq = require(“mysql”); var mc = mq.createConnection(db_options); mc.connect();

exports.getName = function(req, res) { var username = req.body[“name”];

var sql = "select name from `user` where name = " + username;

mc.query(sql, function(err, rs, fields){ mc.end(); mc.destroy() var info=“123”; if(err){ info = “系统异常”; mc.end(); mc.destroy()

	} 
	console.log(info);
	console.log(rs);
	res.write(JSON.stringify(rs));
	//console.log(JSON.stringify(rs));

});

};

我只是想写 用户名重复验证 $.ajax() 为什么会出现这样的问题!


4 回复

问题分析

你遇到的错误 Cannot enqueue Quit after invoking quit 是因为在 MySQL 连接关闭后,你仍然尝试使用该连接执行查询操作。具体来说,在调用 mc.end()mc.destroy() 之后,MySQL 模块会认为连接已经关闭,并拒绝执行任何后续的操作。

解决方案

确保在连接关闭之前不要再次使用它。你可以通过以下方式来优化你的代码:

  1. 确保只调用一次 end()destroy()
  2. 在执行完所有数据库操作后再关闭连接

示例代码

var db_options = {
    host: 'localhost',
    port: 3308,
    user: 'root',
    password: '',
    database: 'mysql'
};

var mq = require("mysql");
var mc = mq.createConnection(db_options);

mc.connect();

exports.getName = function(req, res) {
    var username = req.body["name"];

    var sql = "SELECT name FROM `user` WHERE name = ?";

    mc.query(sql, [username], function(err, rs, fields) {
        if (err) {
            console.error('Error executing query', err);
            res.status(500).send({ error: "系统异常" });
        } else {
            // 只有在查询成功后才关闭连接
            mc.end();
            res.send(JSON.stringify(rs));
        }
    });

    // 不需要手动调用 mc.destroy()
};

关键点解释

  1. 参数化查询:使用 ? 作为占位符,可以有效防止 SQL 注入攻击。
  2. 避免重复关闭连接:在查询完成后关闭连接,而不是在每次错误处理中都关闭。
  3. 错误处理:在发生错误时,直接返回错误信息给客户端,并且不需要再次调用 mc.end()mc.destroy()

通过这些修改,你应该能够解决 Cannot enqueue Quit after invoking quit 的错误,并实现用户名重复验证的功能。


你这代码数据库的连接是执行一次的吗?查询完之后没有必要mc.end(); 啊,留一个连接实例不好吗,你这关了连,连了关的

nodejs+mysql demo

你遇到的错误是因为你在 mc.query 回调函数中多次调用了 mc.end()mc.destroy()。当 mc.end() 被调用后,连接会被关闭,后续尝试使用该连接的任何操作都会失败。

你可以简化代码并确保只在适当的时候调用 enddestroy 方法。下面是修改后的代码:

var db_options = {
    host: 'localhost',
    port: 3308,
    user: 'root',
    password: '',
    database: 'mysql'
};

var mq = require("mysql");
var mc = mq.createConnection(db_options);

exports.getName = function (req, res) {
    var username = req.body["name"];
    var sql = "SELECT name FROM `user` WHERE name = ?";
    
    mc.query(sql, [username], function (err, rs, fields) {
        if (err) {
            console.error("查询出错:", err);
            res.status(500).send({ error: "系统异常" });
        } else {
            console.log("查询结果:", rs);
            res.send(rs);
        }
    });

    // 在所有操作完成后关闭连接
    mc.end();
};

解释:

  1. 参数化查询:使用参数化查询 (SELECT name FROMuserWHERE name = ?) 可以防止 SQL 注入攻击。
  2. 错误处理:如果查询出错,返回一个 500 错误响应,并输出错误信息。
  3. 单次连接关闭:在所有操作完成后,仅一次调用 mc.end() 关闭连接。

这样可以避免多次调用 enddestroy 方法导致的错误。

回到顶部