使用 `hosts` 文件映射域时,Node 需要 WSL IP,但 Vite 需要 127.0.0.1

使用 `hosts` 文件映射域时,Node 需要 WSL IP,但 Vite 需要 127.0.0.1

我在 Windows 10 上使用 WSL2/Ubuntu-20.04 进行开发。我创建了一个基本的 Node+Express 服务器:

npm init -y; npm i express

// index.js
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

curl http://localhost:3000/使用 Windows 和 WSL/Ubuntu,都可以正常工作!太棒了。

我添加127.0.0.1 foobar.comC:\Windows\System32\drivers\etc\hosts重新启动 WSL wsl --shutdown,导致\\wsl.localhost\Ubuntu-20.04\etc\hosts重新生成。我curl http://foobar.com:3000/。它在 WSL/Ubuntu 中成功,但在 Windows 中失败curl: (7) Failed to connect to foobar.com port 3000 after 2040 ms: Connection refused。我发现这很令人惊讶,因为我一直在构建一个维特应用程序并在那里更新我的hosts文件。(npm create vite@latest为了解决这个问题,我一直在测试。)

经过一番思考,我发现使用文件中的 WSL IP 地址hosts(例如172.31.230.172 foobar.com,使用 发现的wsl hostname -I)可以让我从 Windows 访问我的 Node 服务器。但是,此更改会破坏我的 Vite 应用程序,并显示与之前的 Node 问题相同的错误消息。

以下是总结我的症状的表格。

代码 主办方 网址 视窗 WSL/Ubuntu
节点 不适用 http://localhost:3000/
维特 不适用 http://localhost:5173/
节点 127.0.0.1 foobar.com http://foobar.com:3000/
维特 127.0.0.1 foobar.com http://foobar.com:5173/
节点 172.30.206.133 foobar.com http://foobar.com:3000/
维特 172.30.206.133 foobar.com http://foobar.com:5173/

理想情况下,我希望127.0.0.1 foobar.com在我的 中使用hosts,因为我的 WSL IP 可能会改变。不过我并不是太挑剔。

答案1

事实证明我的 Node 代码应该包含一个主机名:

app.listen(port, "127.0.0.1", () => {...}

我不知道为什么这会起作用。显式的0.0.0.0也有效。

Node 文档状态

如果省略,则当 IPv6 可用时,host服务器将接受未指定的 IPv6 地址 ( ) 上的连接,否则接受未指定的 IPv4 地址 ( ) 上的连接。::0.0.0.0

然而,我的经验并不支持这一点。对于我的机器,主机名必须明确为 127.0.0.1 或 0.0.0.0。我不是唯一一个 -这个问题还询问为什么 Node 中需要主机名才能使hosts文件映射工作。如果你知道的话请回答!

相关内容