gpt4 book ai didi

node.js - 为什么 require ('child-process' ) 在没有 Internet 连接的情况下无法在 Node Webkit 中工作?

转载 作者:搜寻专家 更新时间:2023-10-31 22:33:53 24 4
gpt4 key购买 nike

在最新稳定版本 (v0.18.8) 上运行的 Node-Webkit 应用程序中,我有以下三行:

console.log("Check 1");
var spawn = require('child_process').spawn;
console.log("Check 2");

当我有互联网时,我得到了预期的输出:

Check 1
Check 2

当我断开与 Internet 的连接,或者没有可用的网络时,我得到:

Check 1
net.js:10 Uncaught Error: EFILE
at net.js:10:23
at NativeModule.compile (bootstrap_node.js:531:7)
at NativeModule.require (bootstrap_node.js:472:18)
at internal/child_process.js:6:13
at NativeModule.compile (bootstrap_node.js:531:7)
at NativeModule.require (bootstrap_node.js:472:18)
at child_process.js:12:23
at NativeModule.compile (bootstrap_node.js:531:7)
at Function.NativeModule.require (bootstrap_node.js:472:18)
at Function.Module._load (module.js:446:25)

console.log("Check 2") 永远不会运行,脚本的其余部分将被忽略。

我不应该需要 Internet 连接来要求某些东西,所以我对这里出了什么问题感到困惑。此错误也会发生在其他一些 require() 语句中,但不是全部。例如,require('nw.gui') 工作正常。

如何在没有互联网连接的情况下使用 require()

我运行的是 Windows 10,64 位。


这是一个演示问题的示例:

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">

<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Title</title>
</head>

<body>
<p>Body</p>
</body>

<script type="text/javascript">
console.log("Check 1");
var spawn = require('child_process').spawn;
console.log("Check 2");
</script>

</html>

package.json

{
"name": "Demo",
"version": "1.0.0",
"main": "index.html"
}

将这两个文件放在一个文件夹中,并在有 Internet 和没有 Internet 的情况下使用 Node-Webkit 运行。按 F12 打开开发者工具。有网络运行应该不会报错,没有网络运行会报错。

最佳答案

看来您是 c-ares library 中错误的受害者(及其 Node 包装器)在 DNS 配置无效时影响某些 Windows 10 系统(例如,如果您未连接到网络)。

为什么这会影响 child_process

child_process 模块 requires internal/child_process ,这是标准库对 Node 提供的 C++ API 的包装。奇怪的是,internal/child_process 需要 net ,网络模块,然后加载 cares_wrap ,Node 用于 DNS 解析的 c-ares 包装器。

出于某种原因,internal/child_process has some helper code for net ,因此必须加载 net 模块及其所有依赖项(包括 cares_wrap),这意味着如果您的 DNS 配置损坏,child_process 无法加载其依赖项,internal/child_process

因为你得到一个 EFILE,这表明 this part of c-ares fails :

if (get_DNS_Windows(&line))
{
status = config_nameserver(&servers, &nservers, line);
ares_free(line);
}

if (status == ARES_SUCCESS)
status = ARES_EOF;
else
/* Catch the case when all the above checks fail (which happens when there
is no network card or the cable is unplugged) */
status = ARES_EFILE;

如果没有 C 调试器,很难查明确切的问题,但我的猜测是 get_DNS_Windows()以某种方式失败。

如何解决这个问题?

这是我的回答中最不能令人满意的部分。使用 NW.js 的 LTS 时,看起来你得到了 this issue ,因为如果 c-ares 初始化失败,旧版本的 Node 就会崩溃。这已在 this commit 中更改,所以错误现在被捕获并作为 JS 异常抛出。因此,我相信在 Node v6.7.0 之后行为会发生变化。 .

据我所知,最好的解决方案是在虚拟机(或者可能是 Docker/Vagrant 容器)中运行 Node 来解决这个问题,直到它在上游得到修复。绝对值得向 Node 或 c-ares 报告问题,并提供尽可能多的信息(这篇文章可能对某些人有帮助,前提是我没有犯任何错误)。我也会看#8966因为它似乎与您的问题非常相似,即使不一样。

关于node.js - 为什么 require ('child-process' ) 在没有 Internet 连接的情况下无法在 Node Webkit 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40811599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com