从 Node child_process 执行 Argo Tunnel 时出现错误 1016

Posted

技术标签:

【中文标题】从 Node child_process 执行 Argo Tunnel 时出现错误 1016【英文标题】:Error 1016 when executing Argo Tunnel from Node child_process 【发布时间】:2020-01-01 07:27:46 【问题描述】:

来自节点 child_process 的 Cloudflare Argo 隧道

我有一个电子应用程序,我想从中生成一个执行的子进程

cloudflared tunnel --url localhost:3000

在某个目录中。从该目录中的 cmd 执行此操作会按预期实例化 argo 隧道,并且该 url 在进程运行时有效。这就是我从电子应用程序执行命令的方式:

const  spawn  = require('child_process')

let tunnel = spawn('cloudflared', ['tunnel', '--url', 'localhost:4000'], 
  stdio: 'inherit', // Will use process .stdout, .stdin, .stderr
  cwd: 'c://cloudflare'
)

我可以看到来自 cloudflare 的正常控制台输出,表明隧道已建立并且我的服务器正在 some-random-name.trycloudflare.com 上响应。但是,当从电子应用程序中启动该过程时,我在 cloudflare 错误页面上显示错误 1016。

有人有使用 Argo Tunnel 和 child_process 的经验吗?

【问题讨论】:

我对 cloudflare 没有任何经验,但错误代码意味着 cloudflare 没有找到您的原始 PC(因此某种 IP 不匹配)。首先,在您的 cmd 示例中,您有 localhost:3000,在您的电子示例中,您有 localhost:4000,所以这可能是您忽略的东西?除此之外:您是否在本地服务器上运行您的 Electron 应用程序?这可能是另一个问题来源。 我安装了 Electron Fiddle 以及 cloudflared cli,并且能够生成一个执行“cloudflared tunnel --url localhost:3000”的 child_process,其中 Argo Tunnel 按预期工作。 No problem. 【参考方案1】:

我能够让您的设置在我的 Mac 上正常运行,因此您需要进一步查看设置的详细信息。这是我所做的:

    从 GitHub 安装 Electron Fiddle v0.9.0 通过homebrew 安装cloudflared 版本2019.8.4
    brew install cloudflare/cloudflare/cloudflared
    
    从命令行(终端窗口),运行
    cloudflared tunnel --url localhost:3000
    
    cloudflared 有一些抱怨:

    无法确定默认配置路径。 [~/.cloudflare ~/.cloudflare-warp ~/cloudflare-warp /usr/local/etc/cloudflared /etc/cloudflared]中没有文件[config.yml config.yaml]

    从 shell 运行时,cloudflared 不会自动更新

    无法连接到源错误="Get http://localhost:3000: dial tcp [::1]:3000: connect: connection denied"

    在 localhost:3000 上启动了一个 Web 服务器
    python -m SimpleHTTPServer 3000
    
    在我的浏览器中加载了页面http://localhost:3000 又跑了
    cloudflared tunnel --url localhost:3000
    
    同样的抱怨,除了这次它能够连接:

    代理隧道请求到http://localhost:3000

    cloudflared 的进一步输出表明它正在建立 4 个隧道。对于每个隧道,它输出

    +-----------------------------------------------------------+
    |  Your free tunnel has started! Visit it:                  |
    |    https://sides-universe-gym-metadata.trycloudflare.com  |
    +-----------------------------------------------------------+
    Route propagating, it may take up to 1 minute for your new route to become functional
    

    请注意,我没有更改或混淆 URL,这正是输出的内容,cloudflared 输出相同的 URL 4 次,每个隧道一次。

    我去了 https://sides-universe-gym-metadata.trycloudflare.com 并确认它显示了我在 localhost:3000 上打开的同一个网站。

    我通过在运行它的终端窗口中键入 ctrl-c 退出 cloudflared。关闭需要很长时间,但我一直等到它退出。

    我去了https://sides-universe-gym-metadata.trycloudflare.com 并验证它显示错误。它显示“错误 1016”和“源 DNS 错误”。

    在 Electron Fiddle 中,我选择了 Electron v6.0.6 并使用了默认的预装 main.jsindex.htmlrenderer.js。在main.js,我在底部添加了

    const  spawn  = require('child_process')
    
    let tunnel = spawn('cloudflared', ['tunnel', '--url', 'localhost:3000'], 
      stdio: 'inherit', // Will use process .stdout, .stdin, .stderr
      cwd: '/Users/user/development'
    )
    
    
    我在 Electron Fiddle 上单击了“运行”。 “你好世界!”页面出现了。电子控制台显示来自cloudflared 的输出。 再次cloudflared 建立了 4 个隧道,每个隧道的 URL 为 https://citysearch-celebs-generator-history.trycloudflare.com cloudflared 然后登录:

    cloudflared 已更新至 2019.8.4 版本

    新进程的PID是81076

    退出...

    指标服务器已停止

    我不知道为什么它从“2019.8.4”“更新”到“2019.8.4”。也许它与没有默认配置有关,也许它与 Electron Fiddle 从非标准位置运行它有关。我怀疑这是因为命令行不包含--is-autoupdated=true。 “指标服务器已停止”cloudflared 立即开始记录其启动消息,就像以前一样。 它再次启动了 4 个隧道,这次是 URL https://gifts-jpg-treasury-correct.trycloudflare.com 从启动到重新启动到最后一个稳定隧道启动所用的总时间:14 秒。 我在本地浏览器中访问了https://gifts-jpg-treasury-correct.trycloudflare.com,再次获得了我在 localhost:3000 托管的网站。 我在 Electron 中点击了“停止”。 Electron 服务器停止,但cloudflared 继续运行。我仍然可以加载https://gifts-jpg-treasury-correct.trycloudflare.com/ 我在 Electron 中点击了“运行”。再次cloudflared 提出了 4 个隧道。这次它没有自动更新或重新启动。 4 个新隧道都具有相同的新 URL:https://reject-pride-built-twisted.trycloudflare.com/ 我在本地浏览器中访问了https://reject-pride-built-twisted.trycloudflare.com/,再次获得了我在 localhost:3000 托管的站点。我试过https://gifts-jpg-treasury-correct.trycloudflare.com,它也仍然有效。

所以我无法重现您的问题。可能的问题是您可能一直在查看出现的第一个隧道,但 cloudflared 已更新、关闭该隧道并启动了另一个隧道。这在 Mac 上对我有用,但您似乎在 Windows 上工作,所以它可能是一些特定于 Windows 的问题。可能是您没有在 localhost:4000 上运行的服务器,或者您的 Electron 应用无法访问 C://clouflare

您需要提供更多信息,例如运行 cloudflared 的 Electron 应用程序的日志输出以及运行在 localhost:4000 的服务器的详细信息以及您设置的任何 cloudflared 配置文件。

【讨论】:

【参考方案2】:

常见原因 Cloudflare 无法解析源站 Web 服务器的 IP 地址。

错误 1016 的常见原因有:

缺少提及源 IP 地址的 DNS A 记录。 Cloudflare DNS 中的 CNAME 记录指向无法解析的外部域。 Cloudflare 负载均衡器默认、区域和回退池中的源主机名 (CNAME) 无法解析。使用配置有源 IP 的备用池作为备份,以防所有其他池不可用。 分辨率

解决错误 1016:

1) 验证您的 Cloudflare DNS 设置是否包含指向通过 DNS 查找工具解析的有效 IP 地址的 A 记录。 2) 对于指向不同域的 CNAME 记录,请确保通过 DNS 查找工具解析目标域。

【讨论】:

在没有评论或详细说明的情况下从另一个网站复制和粘贴文档并不是很有帮助。此外,这不适用于 OP 的问题,因为他使用的是由 Cloudflare 完全管理的some-random-name.trycloudflare.com,并且不会出现在“您的 Cloudflare DNS 设置”中。

以上是关于从 Node child_process 执行 Argo Tunnel 时出现错误 1016的主要内容,如果未能解决你的问题,请参考以下文章

node child_process没有在mac上执行多一个命令,但在windows上工作正常

node child_process模块

node.js 安全/转义中的 child_process 生成

Node 核心模块之 child_process

如何从 Node.js 中执行外部程序?

详解node多进程child_process用法及原理