为什么当通过process.stdininputstream时节点完成/closures?

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

我学会了如何绑定到process.stdin http://dailyjs.com/2012/03/08/unix-node-pipes/

这是一个例子。 以下是我在terminal中提问的UI。

var inquirer = require("inquirer"); function runInquirer(choices) { inquirer.prompt([ { type: "checkbox", message: "Select toppings", name: "toppings", choices: choices } ], function( answers ) { console.log( JSON.stringify(answers, null, " ") ); }); } 

如果我直接调用处理程序,它的工作原理

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

但是,当我试图将数据input到它

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

它显示问题,然后立即退出。 所以它不会等待我的用户input。

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

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

我也用另一个名为https://github.com/yaronn/blessed-contrib的节点用户界面库尝试了这个testing,得到了相同的结果。

您似乎对进程如何处理stdin有所误解。 inquirer.prompt使用stdinstdout来设置提示,以接受用户input并将输出写入terminal。 process.stdin.on('data',设置一个处理程序,在数据到达stdin时读取数据

 cat questions.json | node test.js 

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

这意味着你的两种input方法实际上都在尝试使用相同的频道。 用你目前的结构,问题的答案也必须来自你的questions.json文件。 它正在退出,因为该文件内容已经用完,不可能有任何问题的答案。

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