无法从 wsl 连接到 mySQL 服务器

Led*_*ake 2 mysql node.js windows-subsystem-for-linux

我在 Windows 计算机上安装了 mySQL 服务器,还安装了 WSL,这样我就可以在 Windows 计算机上使用 Linux 的所有优点。我有一个任务是使用 Express 来创建一个连接到数据库的 JS api,所以我运行我的 mySQL 服务器,一切都运行正常,但是当我使用 WSL 启动 JS apinode 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
Run Code Online (Sandbox Code Playgroud)

如果我从 CMD 运行相同的命令,node index.jsAPI 工作正常

Server running on port 8080 , http://localhost:8080
Connected to database
Run Code Online (Sandbox Code Playgroud)

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

Mot*_*oti 11

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

最简单的解决方案是获取 Windows 的 IP 地址,并使用该地址而不是 localhost 连接到数据库。

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

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

然后运行:

source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

现在改为localhost使用winhost. 请告诉我这是否对您有帮助