无法从 wsl 连接到 mySQL 服务器

Can't connect to mySQL server from wsl

我在我的 Windows 机器上安装了 mySQL 服务器,我还安装了 WSL,所以我可以在我的 Windows 机器上使用 linux 的所有好东西.我有一个任务要创建一个 JS api 与 express 连接到数据库,所以我 运行 我的 mySQL 服务器一切正常 运行ning,但是当我开始JS api 使用来自 WSL 的 node index.js 并尝试连接到数据库,它抛出一个 sql 错误

Server running on port 8080 , http://localhost:8080
/mnt/c/Users/ngkil/Documents/VSCode/WebDevAssignment2022/Backend/index.js:43
                if (err) { throw err; }
                           ^

Error: connect ECONNREFUSED 127.0.0.1:3306
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1195:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 3306,
  fatal: true
}

Node.js v18.1.0

如果我 运行 来自 CMD 的相同命令 node index.js api 工作正常

Server running on port 8080 , http://localhost:8080
Connected to database

我不明白我的 mySQL 服务器和 WSL 之间出了什么问题,两者之间存在的唯一交互是我尝试从 WSL 连接到本地主机,这是一个 unix 问题吗? ?

这不起作用,因为 WSL2 是 运行 由 Windows 虚拟机平台(Hyper-V 的子集)创建的虚拟网络 (vNIC)。在 WSL2 中,localhost 是 vNIC 的地址。

最简单的解决方案是获取您的 windows 的 IP 地址并使用此地址而不是本地主机连接到数据库。

不幸的是,每次您 运行 您的 linux 时 IP 都会改变。 WSL 将您的 windows 主机 IP 存储在 /etc/resolv.conf 文件中。所以可以修改/etc/hosts,将winhost动态映射到主机IP。为此,请在 ~/.bashrc 文件末尾添加以下行:

export winhost=$(cat /etc/resolv.conf | grep nameserver | awk '{ print  }')
if [ ! -n "$(grep -P "[[:space:]]winhost" /etc/hosts)" ]; then
        printf "%s\t%s\n" "$winhost" "winhost" | sudo tee -a "/etc/hosts"
fi

然后 运行:

source ~/.bashrc

现在 localhost 使用 winhost。如果对您有帮助,请告诉我