问题描述

  • 笔者把服务器上的node,从14升级到18
  • 再次使用express的连接池连接mysql的时候(mysql版本:2.18.1)
  • 出现连接不上的报错
  • 报错信息如下:
Error: connect ECONNREFUSED ::1:3306
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16)
    --------------------
    at Protocol._enqueue (C:\Users\Administrator\Desktop\code\exress\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Protocol.handshake (C:\Users\Administrator\Desktop\code\exress\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at PoolConnection.connect (C:\Users\Administrator\Desktop\code\exress\node_modules\mysql\lib\Connection.js:116:18)
    at Pool.getConnection (C:\Users\Administrator\Desktop\code\exress\node_modules\mysql\lib\Pool.js:48:16)
    at C:\Users\Administrator\Desktop\code\exress\router.js:41:8
    at Layer.handle [as handle_request] (C:\Users\Administrator\Desktop\code\exress\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Administrator\Desktop\code\exress\node_modules\express\lib\router\route.js:149:13)
    at Route.dispatch (C:\Users\Administrator\Desktop\code\exress\node_modules\express\lib\router\route.js:119:3)
    at Layer.handle [as handle_request] (C:\Users\Administrator\Desktop\code\exress\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Administrator\Desktop\code\exress\node_modules\express\lib\router\index.js:284:15 {
  errno: -4078,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '::1',
  port: 3306,
  fatal: true
}

报错原因——MySQL 使用 IPv4 连接

  • 上述的报错Error: connect ECONNREFUSED ::1:3306::1是IPV6的写法
  • 就是使用IPV6去链接默认mysql的3306端口
  • 不过MySQL 使用 IPv4 连接
  • 当node升级到18的时候
  • 就不支持localhost的写法进行连接了
  • node14的时候,还可以连得上
  • 所以强制使用ipv4的写法即可

原先的连接池写法

// 引入mysql数据库
var mysql = require('mysql')
// 数据库连接池的配置
var pool = mysql.createPool({
  connectionLimit: 100,  // 连接池的大小
  host: 'localhost', // 主机名
  user: 'user',  // 用户名
  password: 'password', // 密码
  database: 'database' // 数据库名称 在数据库里面建立了一个database数据库,里面有很多表格
});
// 暴露连接池
module.exports = pool

改成IPv4连接

var mysql = require('mysql')
var pool = mysql.createPool({
  connectionLimit: 100,
  host: '127.0.0.1',  // 强制使用 IPv4 地址主机连接
  user: 'user',
  password: 'password',
  database: 'database'
});
module.exports = pool

这样的话,问题就解决了


水冗水孚
1.1k 声望590 粉丝

每一个不曾起舞的日子,都是对生命的辜负