Express中MySQL的conn.end()失效,报错Cannot enqueue after invoking quit
解决 "Cannot enqueue Quit after invoking quit" 错误与MySQL连接泛滥问题
嘿,我一眼就看出问题出在哪了——你在使用express-myconnection这个中间件的同时,手动调用了conn.end(),这直接导致了重复关闭连接的冲突,进而引发了那个讨厌的错误,还导致连接泛滥。让我一步步帮你解决:
问题根源
express-myconnection的核心作用就是自动管理数据库连接的生命周期。你配置的是request模式,意味着它会为每个请求创建新连接,当请求处理完成后,中间件会自动调用conn.end()关闭连接。而你手动在代码里再调用一次,就会触发两次quit操作,自然就抛出"Cannot enqueue Quit after invoking quit"的错误了。错误又会导致连接无法被正确释放,最终造成连接泛滥。
解决方案
1. 移除手动的conn.end()调用
把dashboard.js里的conn.end()完全删掉,让express-myconnection来处理连接关闭的逻辑。修改后的dashboard.js代码如下:
var express = require('express'); var router = express.Router(); router.use(function(req, res, next) { console.log(req.method, req.url); next(); }); // 展示CRUD界面 | GET router.get('/', function(req,res,next){ req.getConnection(function(err,conn){ if (err) return next("Cannot Connect"); var query = conn.query('SELECT SUM(total_price) AS transactions_total FROM transactions WHERE date_created = CURDATE(); SELECT SUM(total_profit) AS total_profit FROM transactions', function(err,rows){ if(err){ console.log(err); return next("MySQL error, check your query"); } var ab = {data:rows[0]}; var total_profit = {data:rows[1]}; res.render('dashboard',{ab, total_profit}); // 移除所有手动的conn.end()调用 }); }); }); router.all('/', function(req,res,next){ console.log("route for dashboard executed"); console.log(req.params); next(); }); module.exports = router; console.log('dashboard.js loaded!');
2. 修复路由冲突
你的app.js里有两个处理根路径/的路由:
app.use('/', dashboard);(dashboard.js已经处理了/的GET请求)- 后面的
app.get('/',function(req,res){ res.render('./dashboard.ejs'); });
这会导致同一个请求可能被两次处理,也可能干扰连接的正常释放。把第二个重复的根路由删掉:
// 省略其他代码... app.use('/', router); app.use('/', dashboard); // 移除下面这个重复的根路由 // app.get('/',function(req,res){ // res.render('./dashboard.ejs'); // });
额外说明
当你用express-myconnection的request模式时,每个请求的连接都会被自动创建和销毁,完全不需要手动干预。解决了重复关闭的问题后,连接泛滥的情况也会随之消失,因为每个请求结束后连接都会被正确释放。
内容的提问来源于stack exchange,提问作者Cadmos
相关产品推荐
相关产品推荐

