当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用节点js创建交互式控制台界面?》经验,为你挑选了1个好方法。

我正在创建一个控制台界面,其中程序询问一些问题,用户通过控制台回答它,有问题,用户必须只输入有限的输入,我找到一些方法来获得控制台输入,node js但无法找到方法在询问想要从中创建JSON对象的问题后,限制用户输入并一个接一个地提出问题.例如,我会问以下问题:

你叫什么名字?

列出你的爱好3?

输入所需的用户名?

在问这个问题之后,我将构建一个json像这样的对象

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

我面临的困难是:

如何一个接一个地提问,即连续提问

将用户输入限制为特定计数

输入最终问题的答案后终止程序

我只有很少的经验NodeJs和我能够建立的只是垃圾,这就是我建立的

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);
});



1> 小智..:

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

但是,如果你想要一些本机替代方案,你可以使用Node的EventEmitter对象使事情看起来更有条理,而不是在stdin回调中处理它们:

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');
});

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

基本上,有一个变量可以跟踪您编程的内容,在我们的例子中current.此变量还用于在prompt收到数据时触发EventEmitter.

在内部事件中,我们可以更改current变量以请求其他内容(我做了一个简写:new事件),操纵数据然后我们请,并添加它输入我们的result变量.

如果你想"标记"你的输入(开头的一个小标记),你可以简单地用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' }

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有