为什么当通过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
使用stdin
和stdout
来设置提示,以接受用户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
读取。