Cannot enqueue Handshake after invoking quit的解决方案以及一些思考

前言

最近学习用node连接mysql数据库,遇到了一个问题。
因为数据库的连接会占用cpu,所以我设置,在每次请求的时候与数据库进行连接,在每次请求结束之后,断开与数据库之间的连接。
当你在发出请求的时候执行connection.connect(),无论你在请求末尾是否使用了connection.end(),当你再次请求时,都会视为你进行了一次新的连接。因此你需要执行创建新连接的操作
connection = mysql.createConnection(connection.config);
否则就会报错Cannot enqueue Handshake after invoking quit(调用Quit后无法排队握手)

对于这个错误,我想到了几个解决办法

  1. 在还没有进行请求的时候,就建立与数据库的连接,在请求结束之后,不断开与数据库的连接。即没有connection.end();
    但这个想法有一个问题,即如果发生了意外事件,导致与数据库连接的断开时,我们就没办法再重连了
    这时候我们就需要监听连接的error事件,当因为某一些我们无法控制的错误导致数据库的连接断开时,我们就需要创建一个新的连接,并与之连接。

  2. 当每次进行请求时,创建一个新的连接(其实第一次是连接的时候)是不需要创建的
    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();
    });
  }

当然,这样原生的建立以及终端连接太麻烦了,接下来我将使用连接池。

你可能感兴趣的:(node)