我想向用户提问,但又不想立即列出所有问题。
该文档提到了 rxjs,但我觉得文档中关于如何在执行提示时正确添加问题的问题存在差距,或者至少它对我来说不太有效。
https://www.npmjs.com/package/inquirer#reactive-interface
在内部,Inquirer 使用 JS 反应式扩展来处理事件和异步流。
这意味着您可以利用此功能来提供更高级的流程。例如,您可以动态添加要询问的问题:
var prompts = new Rx.Subject();
inquirer.prompt(prompts);
// At some point in the future, push new questions
prompts.next({
/* question... */
});
prompts.next({
/* question... */
});
// When you're done
prompts.complete();
Run Code Online (Sandbox Code Playgroud)
使用返回值处理属性,您可以访问更细粒度的回调:
inquirer.prompt(prompts).ui.process.subscribe(onEachAnswer, onError, onComplete);
Run Code Online (Sandbox Code Playgroud) 我一直遇到与查询器 npm 包有关的问题,并且在任何地方都找不到解决方案。我试图允许用户在任何时候退出函数中的查询器提示并返回主菜单。但是,这似乎导致查询器提示的多个实例保持活动状态,从而导致此错误:
(节点:9756)MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。添加了 11 个出口侦听器。使用emitter.setMaxListeners() 增加限制
并且还导致特定功能中的查询器提示开始多次显示相同的提示。在尝试多次使用该功能后,我附上了该行为的图像。 提示错误
我已尝试增加事件侦听器的最大数量,以阻止内存泄漏错误,但查询器提示错误不受影响。
inquirer.prompt([
{
name: 'itemid',
type: 'input',
message: 'Please enter the product id. (type "exit" to return to main menu)',
validate(answer) {
//validates the id provided exists in the database. If exit is entered, returns to main().
var valid = false;
var exit = answer.toLowerCase();
id = parseInt(answer);
if (exit == "exit") {
return main();
}
for (var j = 0; j < idCheckArray.length; j++) {
if (answer == …Run Code Online (Sandbox Code Playgroud) 因此,我想做的是在进一步询问问题时使用先前的答案。基本上,这样我可以显示将要创建的内容的摘要并要求进行验证。
this.prompt([
{
type: 'input',
name: 'name',
message: 'What is your name?'
default: 'Jake'
},
{
type: 'confirm',
name: 'summary',
message: 'Is this information correct? Your name is:' + answers.name',
}
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法可以做到这一点?还是实现列出所有先前答案的摘要类型事物的另一种方式?
我正在使用查询器,我可以创建“列表”类型或“原始列表”类型。
我的目标是允许用户从 sql 数据库的产品数组中选择一个项目,但我现在很好奇这两种列表类型之间有什么区别?在文档中,定义是:
列表 - {type: 'list'} 获取类型、名称、消息、选择[、默认值、过滤器] 属性。(注意default必须是数组中的选择索引或者选择值)
和
原始列表 - {type: 'rawlist'} 采用类型、名称、消息、选择[、默认值、过滤器] 属性。(注意default必须是数组中的选择索引)
但我不明白它们的意思,也不明白它们的区别。
我正在尝试创建一个小型构建脚本,如果在默认路径中找不到 mysql 标头,该脚本将询问用户 mysql 标头的位置。现在我用来inquirer提示用户输入,效果很好,但我遇到了以下问题:
'use strict'
const inquirer = require('inquirer')
const fs = require('fs')
const MYSQL_INCLUDE_DIR = '/usr/include/mysql'
let questions = [
{
type: 'input',
name: 'MYSQL_INCLUDE_DIR',
message: 'Enter path to mysql headers',
default: MYSQL_INCLUDE_DIR,
when: (answers) => {
return !fs.existsSync(MYSQL_INCLUDE_DIR)
},
validate: (path) => {
return fs.existsSync(path)
}
}
]
inquirer.prompt(questions)
.then((answers) => {
// Problem is that answers.MYSQL_INCLUDE_DIR might be undefined at this point.
})
Run Code Online (Sandbox Code Playgroud)
如果找到 mysql 标头的默认路径,则不会显示问题,因此不会设置答案。如何设置问题的默认值而不实际向用户显示它?
解决上述问题也可以做到这一点,而不是使用全局变量:
let questions = [
{
type: …Run Code Online (Sandbox Code Playgroud) const inquirer = require("inquirer")
var questions = [
{
type: "number",
name: "name",
message: "Please the number of players",
validate: function (name) {
var valid = Number.isInteger(name)
return valid || `Please enter a valid whole number`
},
},
]
function promptUser() {
inquirer
.prompt(questions)
.then((answers) => {
console.log(`You entered ${answers["name"]}!`)
})
.catch((error) => console.log(`Please enter a number`))
}
promptUser()
Run Code Online (Sandbox Code Playgroud)
考虑到上面的代码,我在类似这样的旧视频中注意到,如果您包含验证并且失败,输入将被清除。然而,就我而言,我得到的 NaN 不会自动清除。假设我启动应用程序并输入“abcdefg”:
? Please the number of players NaN
>> Please enter a valid whole number
Run Code Online (Sandbox Code Playgroud)
如果我输入任何内容,它只会添加到 NaN …
我已经看到了关于如何为 Inquirer.js 编写单元测试?
我想测试我的验证是否正确。例如,如果我有:
const answer = await inquirer.prompt({
name: 'answer',
message: 'are you sure?'
type: 'input',
validate: async (input) => {
if (input !== 'y' || input !== 'n') {
return 'Incorrect asnwer';
}
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
我想运行一个单元测试,我可以运行并验证如果我提供了blah,验证将正确验证。我该如何为此编写测试?
PS D:\Cursos\nodeudemy\aulas\2_FUNDAMENTOS\10_abstracao_input> node index.js
D:\Cursos\nodeudemy\aulas\2_FUNDAMENTOS\10_abstracao_input\index.js:1
const inquirer = require('inquirer')
^
Error [ERR_REQUIRE_ESM]: require() of ES Module D:\Cursos\nodeudemy\aulas\2_FUNDAMENTOS\10_abstracao_input\node_modules\inquirer\lib\inquirer.js from D:\Cursos\nodeudemy\aulas\2_FUNDAMENTOS\10_abstracao_input\index.js not supported.
Instead change the require of inquirer.js in D:\Cursos\nodeudemy\aulas\2_FUNDAMENTOS\10_abstracao_input\index.js to a dynamic import() which is available in all CommonJS modules.
at Object.<anonymous> (D:\Cursos\nodeudemy\aulas\2_FUNDAMENTOS\10_abstracao_input\index.js:1:18) {
code: 'ERR_REQUIRE_ESM'
}
Run Code Online (Sandbox Code Playgroud)
每次我尝试使用查询器运行节点文件时都会发生这种情况
inquirer ×8
javascript ×5
node.js ×4
inquirerjs ×2
npm ×2
definition ×1
fs ×1
module ×1
node-modules ×1
rxjs ×1
syntax ×1
yo ×1