在Windows中出现“未知的stdin文件类型”错误

11

我已经在这些错误上苦苦挣扎了两天,但仍然不知道为何electron渲染器process.stdin在Windows操作系统中失败。

如何复现:

输入 npm install devtool -g 然后输入 devtool 在控制台内输入 process.stdin 将出现错误消息 将会有两个错误,一个在C:\Users\rafael\AppData\Roaming\npm\node_modules\devtool\node_modules\electron-prebuilt\dist\resources\atom.asar\renderer\lib\init.js的第127行,另一个在第128行(devtool升级至2.x)

Error: Implement me. Unknown stdin file type!

C:\Users\rafael\AppData\Roaming\npm\node_modules\devtool\node_modules\electron-prebuilt\dist\resour…:127 Error: Implement me. Unknown stdin file type!(…)(anonymous function) @ C:\Users\rafael\AppData\Roaming\npm\node_modules\devtool\node_modules\electron-prebuilt\dist\resour…:127Module._compile @ module.js:425Module._extensions..js @ module.js:432Module.load @ module.js:356Module._load @ module.js:313Module.runMain @ module.js:457startup @ node.js:151(anonymous function) @ node.js:1007 C:\Users\rafael\AppData\Roaming\npm\node_modules\devtool\node_modules\electron-prebuilt\dist\resour…:128 Error: Implement me. Unknown stdin file type! at process.stdin (node.js:747) at hookProcess (C:\Users\rafael\AppData\Roaming\npm\node_modules\devtool\lib\preload.js:117) at C:\Users\rafael\AppData\Roaming\npm\node_modules\devtool\lib\preload.js:29 at Object.<anonymous> (C:\Users\rafael\AppData\Roaming\npm\node_modules\devtool\lib\preload.js:129) at Module._compile (module.js:425)

在Object.Module._extensions..js (module.js:432)文件中, 在Module.load (module.js:356)函数处出现错误。 使用Function.Module._load (module.js:313)方法进行加载,但仍然需要调用Module.require (module.js:366)和require (module.js:385)方法。 该错误的位置为C:\Users\rafael\AppData\Roaming\npm\node_modules\devtool\node_modules\electron-prebuilt\dist\resour…:128. 在module.js:425中编译模块,使用Module._compile方法,并在module.js:432中使用Module._extensions..js方法。最终,在module.js:457中运行主要函数,启动node.js:151和(anonymous function) @ node.js:1007。

你是否在使用标准的Windows命令行shell,cmd.exe? - Harry Johnston
我已经尝试了prompt、git bash和powershell... - rafaelcastrocouto
5个回答

3
我遇到了相同的问题。
起初,我认为作为 REPL 的 devtool 不需要 stdin,并且这只是 Windows 构建中的一个简单错误。GitHub 存储库所有者通过在启动时忽略 stdin 来修复它,但正如您已经发现的那样,在 Windows 中,devtool 已经损坏了,您无法使用 stdin 进行任何操作。
作为概念证明,我创建了一个超出 devtool REPL 的简单示例:
这段代码不起作用。
//test.js
var readline = require('readline');
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: true
});

rl.on('line', function(line){
    console.log(line);
})

devtool test.js < input.txt

Error: Implement me. Unknown stdin file type!

Windows 7 x64,S.O.管理员权限,Node v5.10.0,npm v3.8.3 DevTool v1.9.1。

我曾在您的Github 问题 中留下评论,但已关闭,因此我开了一个新问题


自从 devtool 2.x 版本以后,您需要在控制台中键入 process.stdin 才能查看错误。 - rafaelcastrocouto
这肯定是与Windows相关的问题,因为在其他操作系统中没有发生过...我真的认为问题出在Electron上。 - rafaelcastrocouto

1

这里有另一个问题指向同样的问题。其中一条评论提到了这是一个已知的 iisnode 问题,并建议通过包装对process.stdin的所有调用来解决:

if(!process.env.IISNODE_VERSION) { 
    // do stuff with process.stdin 
}

这可以是一个临时解决方案。我相信你已经看过那篇文章了,你觉得怎么样?


Iisnode是在IIS中托管Node.js的工具。我不认为它有关联。 - jlvaquero

1
阅读libuv源代码,这是nodejs用于某些低级操作的代码库,似乎原因是无法具体确定Windows的缓冲区或句柄类型。 GetFileType 函数似乎返回一个未知的句柄。

这绝对是仅限于Windows的问题,因为确定句柄类型的库部分位于UV源代码的 src/win/handle.c,我认为这实际上不会影响 *NIX 操作系统。

也许安装的nodejs版本缺少构建时选项?


我最终也来到了“handle.c”文件,并且仍在寻找一种在Windows上使其工作的方法。 - rafaelcastrocouto
@rafaelcastrocouto 嗯,问题在于他们依赖于GetFileType函数来获取句柄类型,而这是一个微软操作系统函数,它返回一个未知的句柄。我对这个领域不是很了解,但这让我想到修复方法可能不仅仅是在你的JS代码中进行简单的黑客攻击...也许可以在nodejs bugtracker上开个问题? - Gustavo Rubio
我可以问一下为什么你需要在Windows上做这个吗?只是好奇,为什么不在虚拟机或其他地方构建它呢?最坏的情况是你可以尝试使用Cygwin,但我不确定在Cygwin环境中构建Node.js会有多难。 - Gustavo Rubio
我完全不需要,我在这里通过解决一个问题而遇到了这个。我真的只想让模块在任何操作系统上正常工作。 - rafaelcastrocouto

1
一个超级简单的解决方法是强制devtool在自己的控制台窗口中运行。
因此,不要运行:
devtool

Run this:

start devtool

它应该在新窗口中弹出,不要混淆输入管道。
同样的技巧适用于许多Node包。

0
我在尝试从控制台窗口启动 electron 时遇到了这个错误;这很奇怪,因为它一直正常工作。我今天意识到我改变的唯一事情是从Visual Studio Code(带有附加组件)启动终端窗口。
如果我使用从 VS Code 创建的终端(终端插件),那么当我尝试运行 node_modules\.bin\electron 时,我会得到:
d:\Code\Applications\Example>"node_modules\.bin\electron"
internal/process/stdio.js:86
        throw new Error('Implement me. Unknown stdin file type!');
        ^

Error: Implement me. Unknown stdin file type!
    at process.stdin (internal/process/stdio.js:86:15)
    at startup (node.js:198:18)
    at node.js:457:3

如果我直接在资源管理器中创建控制台窗口,它可以完美地工作。

你如何在资源管理器中“直接创建控制台窗口”? - rafaelcastrocouto
请注意,错误出现在电子窗口控制台中,而不是提示本身。 - rafaelcastrocouto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接