問題描述
- 筆者把服務器上的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
這樣的話,問題就解決了