无法从 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
。如果对您有帮助,请告诉我
我在我的 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
。如果对您有帮助,请告诉我