gpt4 book ai didi

javascript - 如何使用node js创建交互式控制台界面?

转载 作者:搜寻专家 更新时间:2023-11-01 00:10:43 24 4
gpt4 key购买 nike

我正在创建一个控制台界面,程序在其中提出一些问题,用户通过控制台回答,有些问题用户只能输入有限的输入,我在 中找到了一些获取控制台输入的方法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);
});

最佳答案

在 NodeJS 中制作 CLI 应用程序后,我建议使用类似 prompt 的库更好地组织您的代码。与您天真地做的事情相比(在我看来),图书馆会让它更具可读性。

但是,如果您想要一些本地替代方案,您可以使用 Node 的 EventEmitter object让事情看起来更有条理,而不是在 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。此变量还用于在收到数据时触发我们的提示 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' }

关于javascript - 如何使用node js创建交互式控制台界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34482581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com