[facebook/docusaurus]Docusaurus 选择端口 3000,即使该端口很忙

2024-05-10 8 views
6
描述

在 macOS 上,请考虑以下脚本server.js

const http = require("http");

const port = 3000;

const requestListener = function (req, res) {
    res.writeHead(200);
    res.end("My first server!");
};

const server = http.createServer(requestListener);

server.listen(port,  () => {
    console.log(`Server is running on http://localhost:${port}`);
});

使用 运行它node server.js。然后启动 Docusaurus 项目(在我的例子中运行在 v2.1.0 上)。文档服务器将在端口 3000 上启动,尽管该端口很忙。如果您随后在 Chrome 中打开 Docusaurus:

图像

它打开我的服务器。

但是,如果我使用curl,我会得到 docusaurus 页面!

截图 2022-10-11 11 52 58

如果我的服务器通过主机:

- server.listen(port,  () => {
+ server.listen(port, "localhost",  () => {

然后 Docusaurus 将正确识别该端口正忙并询问我是否要选择另一个端口。尽管如此,我将其视为 Docusaurus 或其依赖项之一中的错误。

可能的解决方案

尽管使用的人较少,但这种查找空闲端口的逻辑现在可以在 Remotion 中使用,并且不会出现错误报告:https://github.com/remotion-dev/remotion/blob/main/packages/renderer/src/get-port .ts

我很高兴在 Discord 上讨论如何一起调查它!

可重现的演示

没有反应

重现步骤

如上

预期行为

繁忙端口检测启动并询问是否应使用不同的端口

实际行为

服务器启动并产生冲突

您的环境
  • Docusaurus 使用版本:v2.1.0
  • 环境名称和版本(例如 Chrome 89、Node.js 16.4):Node 16.7
  • 操作系统和版本(例如Ubuntu 20.04.2 LTS):macOS

回答

5

我最近也发现了同样的情况。它似乎无法用两台 Docusaurus 服务器重现——只有当一个端口正在运行其他东西时。

1

@Josh-Cena 正确,对此的解释是 Docusaurus 确实如此.listen(3000, "localhost"),这不会导致此问题。

0

尽管使用的人较少,但这种查找空闲端口的逻辑现在可以在 Remotion 中使用,并且不会出现错误报告:remotion-dev/remotion@main/packages/renderer/src/get-port.ts

据我记得这段代码是从https://github.com/facebook/docusaurus/issues/3005中的 CRA 复制的,我们使用检测端口库:https://github.com/node-modules/detect-港口

它似乎使用类似的方法来尝试创建服务器:https://github.com/node-modules/detect-port/blob/master/lib/detect-port.js#L101

也许我们没有传递正确的参数?或者也许值得直接在该库中打开一个错误,以便整个生态系统从修复中受益?

如果有人想调查检测端口是否有错误,那会很方便:)

6

挖了德珀:

  • Docusaurus 使用detect-port@1.3.2而 Facebook 使用detect-port-alt@1.1.6

detect-port-alt使用 4 个步骤来确定端口(请参阅他们的评论):https://unpkg.com/detect-port-alt@1.1.6/lib/detect-port.js

detect-port只需3步即可确定端口,逻辑明显不同:https://unpkg.com/detect-port@1.3.0/lib/detect-port.js

  • Facebooks0.0.0.0作为hostname参数传递给detect-port-alt,而 Docusaurus 使用127.0.0.1作为hostname参数

我发现如果 Docusaurus 切换到detect-port-alt, 并0.0.0.0改为使用,它也会像 CRA 一样检测到繁忙的端口。不过仅在 macOS 上进行了测试。

1

谢谢 ?

如果有人可以创建一个适合所有人的共享包就好了?看起来 CRA 现在正在使用 detector-port-alt(由 Dan Abramov 发布,没有链接分支存储库?)。这可能是有充分理由的。

有趣的相关 CRA 问题:

8

Docusaurus 默认绑定到环回接口,这不会与尝试侦听所有接口的另一个进程发生冲突。

如果主机设置为0.0.0.0:在这种情况下,开发工具将检测到冲突:

$ npx docusaurus start -h 0.0.0.0
✔ [WARNING] Something is already running on port 3000. Probably:
  `node server.js` (pid 44444) in "/private/tmp"

也许应该更改默认值?请注意,这0.0.0.0会将开发服务器暴露给其他设备。这可以说是一件好事,因为如果手机位于同一网络上,您可以预览手机上的更改

6

现在这对我有用:

npm 脚本:

docusaurus start --port $(detect 3000)

并将检测端口安装为开发依赖项

不确定这是否适用于带有扩展的 Windows。

我想升级到最新的检测端口可以解决这个问题吗?虽然我看到next devdocusaurus 启动时正在运行。