前言
最近学习用node连接mysql数据库,遇到了一个问题。
因为数据库的连接会占用cpu,所以我设置,在每次请求的时候与数据库进行连接,在每次请求结束之后,断开与数据库之间的连接。
当你在发出请求的时候执行connection.connect(),无论你在请求末尾是否使用了connection.end(),当你再次请求时,都会视为你进行了一次新的连接。因此你需要执行创建新连接的操作
connection = mysql.createConnection(connection.config);
否则就会报错Cannot enqueue Handshake after invoking quit(调用Quit后无法排队握手)
对于这个错误,我想到了几个解决办法
-
在还没有进行请求的时候,就建立与数据库的连接,在请求结束之后,不断开与数据库的连接。即没有connection.end();
但这个想法有一个问题,即如果发生了意外事件,导致与数据库连接的断开时,我们就没办法再重连了
这时候我们就需要监听连接的error事件,当因为某一些我们无法控制的错误导致数据库的连接断开时,我们就需要创建一个新的连接,并与之连接。 -
当每次进行请求时,创建一个新的连接(其实第一次是连接的时候)是不需要创建的
connection = mysql.createConnection(connection.config);
connection.connect()
每当请求结束时,断开连接
connection.end();
const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');
var server = new express();
var connection = mysql.createConnection({
host:'localhost',
user:'root',
password:'191026',
database:'weekly'
})
//位置1
//connection.connect();
// handleDisconnect(connection);
//当使用方法1的时候使用
//登录接口
server.use(bodyParser.urlencoded({}))
server.listen(8082);
server.post('/weekly_war/user/register.do',function(req,res){
console.log("注册:");
console.log(req.body);
var user = req.body;
var data;
// 注册成功需要满足以下条件
// 1.用户名不能为空
if(!user.email){
data = {
msg:"参数为空",
code:1003,
success:false
};
res.write(JSON.stringify(data));
res.end();
}else if(user.password.length<4||user.password.length>18){
// 2.密码的长度符合要求
data = {
msg:"注册失败,密码长度不对!",
code:1004,
success:false
};
res.write(JSON.stringify(data));
res.end();
}else{
// 3.用户名在数据库中不存在
//在数据库中创建一个user表,保存注册的用户信息
//当要新添入用户的时候,就查看user表,如果有相同的用户名,那么注册成功,否则注册失败。
//位置2
connection = mysql.createConnection(connection.config);
connection.connect();
var addSql = "INSERT INTO user(weekly_id,weekly_email,weekly_password,weekly_phone) VALUES(0,?,?,?)";
var addSqlParams = [user.email,user.password,user.phone];
//增加成员
connection.query(addSql,addSqlParams,function(err,result){
if(err){
data = {
msg:"注册失败,用户名已存在",
code:4000,
success:false
}
res.write(JSON.stringify(data));
}else{
data = {
msg:"注册成功",
code:2000,
success:true,
user:{
//id要从数据库中获取
"id":result.insertId,
"email":null,
"password":null,
}
}
res.write(JSON.stringify(data));
//注册成功,再终止数据库的连接
// connection.end();
// console.log('INSERT ID:',result.insertId);
}
res.end();
});
// connection.end();
}
//结束响应
});
// server.post('/weekly_war/user/login.do',function(req,res){
// console.log("登录:");
// console.log(req.body);
// })
function handleDisconnect(connection) {
//监听错误事件
connection.on('error', function(err) {
if (!err.fatal) {
return;
}
if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
throw err;
}
console.log('Re-connecting lost connection: ' + err.stack);
connection = mysql.createConnection(connection.config);
handleDisconnect(connection);
connection.connect();
});
}
当然,这样原生的建立以及终端连接太麻烦了,接下来我将使用连接池。