关于 Node.js 里连接 Mysql 数据库时的一些错误解决办法

问题一


Error connecting to Database Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
    at Handshake.ErrorPacket (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18)
    at Protocol._parsePacket (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Parser.js:433:10)
    at Parser.write (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Parser.js:43:10)
    at Protocol.write (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:38:16)
    at Socket.<anonymous> (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\Connection.js:88:28)
    at Socket.<anonymous> (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\Connection.js:526:10)
    at Socket.emit (node:events:513:28)
    at addChunk (node:internal/streams/readable:315:12)
    --------------------
    at Protocol._enqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Protocol.handshake (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at Connection.connect (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\Connection.js:116:18)
    at C:\Users\xulon\Desktop\Hb\node\node_mysql.js:45:6
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)     
    at next (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:114:3)
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)     
    at C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\index.js:284:15
    at Function.process_params (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\index.js:346:12) {
  code: 'ER_NOT_SUPPORTED_AUTH_MODE',
  errno: 1251,
  sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',      
  sqlState: '08004',
  fatal: true
}
-- 查询:
mysql -u root -p
use mysql;
select user,host from user;
-- 执行:(改成自己的密码)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '000000';
-- 或者:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '000000'

参考:(70条消息) ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘_Mr.Java.的博客-CSDN博客

在这里插入图片描述

问题二


Error connecting to Database Error: Cannot enqueue Handshake after already enqueuing a Handshake.
    at Protocol._validateEnqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:221:16)       
    at Protocol._enqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:138:13)
    at Protocol.handshake (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at Connection.connect (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\Connection.js:116:18)
    at C:\Users\xulon\Desktop\Hb\node\node_mysql.js:45:6
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)     
    at next (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:114:3)
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)     
    at C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\index.js:284:15 {
  code: 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE',
  fatal: false
}

原因:每次请求都连接数据库一次造成,第一次成功,第二次以后失败
解决:将连接写出去
// 原
app.get('/a', (req, res) => {
	con.connect(function(err) {
		if (err) {
			console.log('Error connecting to Database', err);
			return;
		}
		console.log("Connected!");
		// var sql = 'select * from jxgl.score;' // 配置无db
		var sql = 'select * from score;' // 配置有db
		// var sql = "INSERT INTO score (SNO, CNO) VALUES ('960010', '001')"; // 插入
		con.query(sql, function(err, result, fields) {
			if (err) {
				console.log('sql error!', err);
				return;
			}
			console.log("Result: " + result);
		});
	});
})
// 改
con.connect(function(err) {
	if (err) {
		console.log('Error connecting to Database', err);
		return;
	}
	console.log("Connected!");
});
app.get('/a', (req, res) => {
	// var sql = 'select * from jxgl.score;' // 配置无db
	var sql = 'select * from score;' // 配置有db
	// var sql = "INSERT INTO score (SNO, CNO) VALUES ('960010', '001')"; // 插入
	con.query(sql, function(err, result, fields) {
		if (err) {
			console.log('sql error!', err);
			return;
		}
		console.log("Result: " + result);
	});
})

问题三


Error connecting to Database Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:215:16)
    at Protocol._enqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:138:13)
    at Protocol.handshake (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at Connection.connect (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\Connection.js:116:18)
    at C:\Users\xulon\Desktop\Hb\node\node_mysql.js:45:6
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:114:3)
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\index.js:284:15 {
  code: 'PROTOCOL_ENQUEUE_AFTER_QUIT',
  fatal: false
}
sql error! Error: Cannot enqueue Query after invoking quit.
    at Protocol._validateEnqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:215:16)       
    at Protocol._enqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:138:13)
    at Connection.query (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\Connection.js:198:25)
    at C:\Users\xulon\Desktop\Hb\node\node_mysql.js:56:6
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)     
    at next (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:114:3)
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)     
    at C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\index.js:284:15
    at Function.process_params (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\index.js:346:12) {
  code: 'PROTOCOL_ENQUEUE_AFTER_QUIT',
  fatal: false
}
node:events:491
      throw er; // Unhandled 'error' event
      ^

end error! Error: Cannot enqueue Quit after invoking quit.
    at Protocol._validateEnqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:215:16)       
    at Protocol._enqueue (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:138:13)
    at Protocol.quit (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:91:23)
    at Connection.end (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\Connection.js:239:18)
    at C:\Users\xulon\Desktop\Hb\node\node_mysql.js:63:6
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)     
    at next (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\route.js:114:3)
    at Layer.handle [as handle_request] (C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\layer.js:95:5)     
    at C:\Users\xulon\Desktop\Hb\node\node_modules\express\lib\router\index.js:284:15
Emitted 'error' event on Connection instance at:
    at Connection._handleProtocolError (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\Connection.js:423:8)
    at Protocol.emit (node:events:513:28)
    at Protocol._delegateError (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:398:10)
    at Quit.<anonymous> (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:232:10)
    at Quit.emit (node:events:513:28)
    at Quit.Sequence.end (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\sequences\Sequence.js:78:12)      
    at Quit.end (C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\sequences\Quit.js:24:28)
    at C:\Users\xulon\Desktop\Hb\node\node_modules\mysql\lib\protocol\Protocol.js:236:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11) {
  code: 'PROTOCOL_ENQUEUE_AFTER_QUIT',
  fatal: false
}

原因:end() 位置不对,请求中最好不要关闭数据库连接,如果关闭过早,sql不能执行
解决:删掉 end()
// 原
con.connect(function(err) {
	if (err) {
		console.log('Error connecting to Database', err);
		return;
	}
	console.log("Connected!");
});

app.get('/a', (req, res) => {
	//var sql = 'select * from jxgl.score;' // 配置无db
	var sql = 'select * from score;' // 配置有db
	// var sql = "INSERT INTO score (SNO, CNO) VALUES ('960010', '001')"; // 插入
	con.query(sql, function(err, result, fields) {
	if (err) {
			console.log('sql error!', err);
			return;
		}
		console.log("Result: " + result);
	});
	con.end(function(err){
		if (err) {
			console.log('end error!', err);
			return;
		}
	});
})
// 改
con.connect(function(err) {
	if (err) {
		console.log('Error connecting to Database', err);
		return;
	}
	console.log("Connected!");
});

app.get('/a', (req, res) => {
	// var sql = 'select * from jxgl.score;' // 配置无db
	var sql = 'select * from score;' // 配置有db
	// var sql = "INSERT INTO score (SNO, CNO) VALUES ('960010', '001')"; // 插入
	con.query(sql, function(err, result, fields) {
		if (err) {
			console.log('sql error!', err);
			return;
		}
		console.log("Result: " + result);
	});
//	con.end(function(err){
//		if (err) {
//				console.log('end error!', err);
//				return;
//		}
//	});
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值