问题描述
- 笔者把服务器上的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
这样的话,问题就解决了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。