Stories

Detail Return Return

連接mysql:Error: connect ECONNREFUSED ::1:3306 at TCPConnectWrap - Stories Detail

問題描述

  • 筆者把服務器上的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

這樣的話,問題就解決了

user avatar taotao123 Avatar wojiaocuisite Avatar bianchengsanmei Avatar huyouxueboshi Avatar hyfhao Avatar guixudepubu Avatar kaika1 Avatar chuanghongdengdehoutao Avatar xiaoai_60fe84f1e61ed Avatar mengdong_5927a02673e54 Avatar zxbing0066 Avatar fjc0k Avatar
Favorites 16 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.