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() 为什么会出现这样的问题!
问题分析
你遇到的错误 Cannot enqueue Quit after invoking quit
是因为在 MySQL 连接关闭后,你仍然尝试使用该连接执行查询操作。具体来说,在调用 mc.end()
或 mc.destroy()
之后,MySQL 模块会认为连接已经关闭,并拒绝执行任何后续的操作。
解决方案
确保在连接关闭之前不要再次使用它。你可以通过以下方式来优化你的代码:
- 确保只调用一次
end()
或destroy()
。 - 在执行完所有数据库操作后再关闭连接。
示例代码
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()
};
关键点解释
- 参数化查询:使用
?
作为占位符,可以有效防止 SQL 注入攻击。 - 避免重复关闭连接:在查询完成后关闭连接,而不是在每次错误处理中都关闭。
- 错误处理:在发生错误时,直接返回错误信息给客户端,并且不需要再次调用
mc.end()
或mc.destroy()
。
通过这些修改,你应该能够解决 Cannot enqueue Quit after invoking quit
的错误,并实现用户名重复验证的功能。
你这代码数据库的连接是执行一次的吗?查询完之后没有必要mc.end(); 啊,留一个连接实例不好吗,你这关了连,连了关的
nodejs+mysql demo
你遇到的错误是因为你在 mc.query
回调函数中多次调用了 mc.end()
和 mc.destroy()
。当 mc.end()
被调用后,连接会被关闭,后续尝试使用该连接的任何操作都会失败。
你可以简化代码并确保只在适当的时候调用 end
和 destroy
方法。下面是修改后的代码:
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();
};
解释:
- 参数化查询:使用参数化查询 (
SELECT name FROM
userWHERE name = ?
) 可以防止 SQL 注入攻击。 - 错误处理:如果查询出错,返回一个 500 错误响应,并输出错误信息。
- 单次连接关闭:在所有操作完成后,仅一次调用
mc.end()
关闭连接。
这样可以避免多次调用 end
和 destroy
方法导致的错误。