如何使用节点js创build交互式控制台界面?

我正在创build一个控制台界面,其中程序通过控制台提出一些问题和用户的答案,有问题,用户只能input有限的input,我发现了一些方法来获取控制台input的node js但无法find在提出问题想要从中创build一个JSON对象之后,可以限制用户的input并提出问题。 例如,我会问如下问题:

  • 你叫什么名字?
  • 列表3你的爱好?
  • input所需的用户名?

提出这个问题后,我将构build一个json对象

  {"name":"codebean","hobbies":['Exploring','Coding','Trucking'],"username":'codebean'} 

我面临的困难是:

  • 如何连续提问,即连续提问

  • 将用户input限制为特定的计数

  • input最终问题的答案后,终止程序

我对NodeJs只有很less的经验,而且我能够build立的只是垃圾,这就是我所build立的

 process.stdin.setEncoding('utf8'); var input = []; process.stdin.on('readable', function() { console.log('What is your name'); var name = process.stdin.read(); if ((name !== null) && (name !== '/n')) { input.push(name.split('/n')[0]); console.log(input); } console.log('List 3 of your hobbies ?'); var hobbies = process.stdin.read(); }); process.stdin.on('end', function() { console.log(input); }); 

在NodeJS中创build了CLI应用程序之后,我build议使用类似prompt的库来更好地组织代码。 一个图书馆会保持它比你可以天真做的(在我看来)更可读。

然而,如果你想要一些本地的替代品,你可以使用Node的EventEmitter对象来使事情看起来更有组织,反对处理它的所有内部的标准inputcallback:

 var EventEmitter = require('events'); var prompt = new EventEmitter(); var current = null; var result = {}; process.stdin.resume(); process.stdin.on('data', function(data){ prompt.emit(current, data.toString().trim()); }); prompt.on(':new', function(name, question){ current = name; console.log(question); process.stdout.write('> '); }); prompt.on(':end', function(){ console.log('\n', result); process.stdin.pause(); }); prompt.emit(':new', 'name', 'What is your name?'); prompt.on('name', function(data){ result.name = data; prompt.emit(':new', 'hobbies', 'What are your hobbies?'); }); prompt.on('hobbies', function(data){ result.hobbies = data.split(/,\s?/); prompt.emit(':new', 'username', 'What is your username?'); }); prompt.on('username', function(data){ result.username = data; prompt.emit(':end'); }); 

此代码使用某种状态跟踪方法 (我不知道是否有实际的术语)。

基本上,有一个variables可以跟踪你正在寻找的是什么,在我们的例子中是current 。 这个variables也被用来在收到数据时触发我们的prompt EventEmitter。

在内部事件中,我们可以改变currentvariables来请求其他的东西(我做了一个简写:new事件来做到这一点),操纵数据,但我们也请,并添加它input我们的resultvariables。

如果你想“标记”你的input(一开始是一个小标记),你可以简单地用stdin.write来做到这stdin.write

 prompt.on(':new', function(){ // ... process.stdin.write('> '); }); 

以下是代码在实际中的样子:

 $ node ... What is your name? > Jamen Marzonie What are your hobbies? > programming, philosophy, petting cats What is your username? > jamen { name: 'Jamen Marzonie', hobbies: [ 'programming', 'philosophy', 'petting cats' ], username: 'jamen' }