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();
    });
  }

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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常表示在MySQL连接上发生了严重的错误,导致连接不再可用。在这种情况下,你需要关闭现有的MySQL连接,然后重新创建一个新的连接。 以下是一个示例代码,演示如何关闭现有连接并创建新连接: ``` const mysql = require('mysql'); let connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'database_name' }); connection.connect((error) => { if (error) { console.error('Error connecting to MySQL database: ' + error.stack); return; } console.log('Connected to MySQL database with ID ' + connection.threadId); // Perform some MySQL queries here... // When you're done, close the connection connection.end((error) => { if (error) { console.error('Error closing MySQL connection: ' + error.stack); return; } console.log('MySQL connection closed'); // Create a new connection connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'database_name' }); connection.connect((error) => { if (error) { console.error('Error connecting to MySQL database: ' + error.stack); return; } console.log('Connected to MySQL database with ID ' + connection.threadId); // Perform some more MySQL queries here... }); }); }); ``` 请注意,以上代码中的“localhost”、“root”、“password”和“database_name”应替换为你的MySQL数据库的实际信息。此外,你应该在每个查询之后关闭连接,并在需要时重新创建新连接,以避免出现此错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值