如何基于inquirer包的choices选择触发展示后续跟进问题?
当然可以实现!
完全没问题,Inquirer 支持根据用户的选择动态展示后续问题,刚好能满足你选中 Cassandra 后追加相关配置问题的需求。下面是修改后的代码,我会一步步说明实现思路:
实现思路
把提问流程拆分为两个阶段:
- 先收集基础信息(应用名称、描述、作者、插件选择)
- 检查用户是否选中了 Cassandra,如果是,就展示额外的 Cassandra 配置问题
- 合并所有阶段的回答,最后返回完整结果
修改后的代码
const { prompt } = require('inquirer'); require('colors'); // 基础问题集合 const baseQuestions = [ { type: 'input', name: 'appName', message: 'Enter application name:' }, { type: 'input', name: 'appDescription', message: 'Enter app description:' }, { type: 'input', name: 'appAuthor', message: 'Enter app author:' }, { type: 'checkbox', name: 'plugins', message: 'Select plugins to install:', choices: [ { name: 'Cassandra' } ] } ]; // Cassandra 专属配置问题 const cassandraQuestions = [ { type: 'input', name: 'cassandraHost', message: 'Enter Cassandra host (default: localhost):', default: 'localhost' }, { type: 'input', name: 'cassandraKeyspace', message: 'Enter Cassandra keyspace name:' }, { type: 'number', name: 'cassandraPort', message: 'Enter Cassandra port (default: 9042):', default: 9042 } ]; module.exports.performQuestions = async () => { console.log('\nWelcome to Chef!\n'.underline.italic.cyan); // 第一步:收集基础信息 const baseAnswers = await prompt(baseQuestions); // 检查应用名称是否为空 if (!baseAnswers.appName) { console.error('\nPlease provide app name!\n'.red); process.exit(1); } // 第二步:判断是否需要追加Cassandra的问题 let finalAnswers = { ...baseAnswers }; if (baseAnswers.plugins.includes('Cassandra')) { const cassandraAnswers = await prompt(cassandraQuestions); // 合并基础回答和Cassandra配置回答 finalAnswers = { ...finalAnswers, ...cassandraAnswers }; } // 添加固定的appType字段 finalAnswers.appType = 'service'; return finalAnswers; };
关键说明
- 我把问题拆成了
baseQuestions和cassandraQuestions两个数组,逻辑更清晰 - 通过
baseAnswers.plugins.includes('Cassandra')判断用户是否选中了该插件 - 如果选中,就调用
prompt展示额外问题,并把结果合并到最终的回答对象里 - 保留了你原来的颜色样式、应用名称校验和
appType字段设置
这样用户选中Cassandra后,就会自动看到对应的配置问题,没选中的话就直接跳过啦~
内容的提问来源于stack exchange,提问作者David Faizulaev
相关产品推荐
相关产品推荐

