为什么节点在通过process.stdin进行流输入时完成/关闭?

时间:2015-08-17 23:19:50

标签: node.js stdin

我正在尝试创建一个节点应用程序,您可以在JSON数据中管道并将其作为问题显示给用户。

我在这里学习了如何绑定到process.stdin enter image description here

这是一个例子。以下是我在终端提问的用户界面。

 runInquirer([
   {name:'Cheese'},
   {name:'Tomato'}
 ]);

如果我直接调用处理程序,它可以正常工作

  process.stdin.resume();  
  process.stdin.setEncoding('utf8');  
  process.stdin.on('data', function(data) {        
    runInquirer(JSON.parse(data));
  });

但是当我尝试将数据输入其中时

➜  test git:(master) ✗ cat questions.json | node test.js
? Select toppings (Press <space> to select)
 The usual:
 ❯◯ Peperonni
 ◉ Cheese

显示问题,然后立即退出。所以它不是在等待我的用户输入。

从命令行调用的示例(注意管道|)

{{1}}

我还尝试使用另一个名为http://dailyjs.com/2012/03/08/unix-node-pipes/的节点用户界面库进行此测试,结果相同。

1 个答案:

答案 0 :(得分:2)

您似乎对进程处理stdin的方式有些误解。 inquirer.prompt使用stdinstdout接受用户输入并将输出写入终端,从而设置提示。 process.stdin.on('data',设置处理程序,以便在数据到达stdin时读取数据。当你运行

cat questions.json | node test.js

您正在指示您的终端停止使用终端stdin,而是将命令cat的输出用作stdin

这意味着您的两种输入方法实际上都在尝试使用相同的通道。根据您当前的结构,问题的答案也必须来自您的questions.json文件。它会立即退出,因为该文件内容已用完,并且您的inquirer无法获得任何答案。

您可能想要的是test.js文件接受JSON文件作为第一个参数,并读取该文件而不是从process.stdin读取。