如何正确嵌套Inquirer交互式命令行提示符?
解决Inquirer嵌套提示符叠加的问题
核心问题是你的主循环没有等待嵌套的异步操作完成就继续执行,导致主提示符和子提示符同时弹出。以下是具体修复方案:
1. 确保所有操作函数异步化,并在主循环中await执行结果
主函数init()的switch语句里,必须等待每个操作的异步逻辑完全结束后,才进入下一次循环迭代。
错误示例(导致叠加):
async function init() { while (true) { const choice = await inquirer.prompt(mainQuestions); switch(choice.action) { case 'add employee': addEmployee(); // 未await,主循环直接继续运行 break; } } } function addEmployee() { inquirer.prompt(employeeQuestions).then(data => { // 执行SQL操作 }); }
正确写法:
// 将操作函数改为async,内部await所有异步步骤 async function addEmployee() { const employeeData = await inquirer.prompt(employeeQuestions); // 等待SQL插入操作完成 await db.query('INSERT INTO employees SET ?', employeeData); console.log('员工添加成功'); } async function init() { while (true) { const { action } = await inquirer.prompt([ { type: 'list', name: 'action', message: '选择操作:', choices: ['添加员工', '查询员工', '退出'] } ]); switch(action) { case '添加员工': await addEmployee(); // 关键:等待该操作完成再进入下一次循环 break; case '查询员工': await queryEmployees(); break; case '退出': console.log('程序结束'); process.exit(0); default: console.log('无效操作,请重新选择'); } } } init();
2. 多层嵌套提示符需逐层await
如果后续需要多步操作(比如添加员工时先选部门,再输入信息),每一步的inquirer.prompt都要await,确保串行执行:
async function addEmployee() { // 第一步:选择所属部门 const { department } = await inquirer.prompt([ { type: 'list', name: 'department', message: '选择所属部门:', choices: await fetchDepartmentOptions() // 异步获取选项也要await } ]); // 第二步:输入员工基础信息 const { name, role } = await inquirer.prompt([ { type: 'input', name: 'name', message: '员工姓名:' }, { type: 'input', name: 'role', message: '员工职位:' } ]); // 第三步:执行SQL插入操作 await db.query( 'INSERT INTO employees (name, role, department) VALUES (?, ?, ?)', [name, role, department] ); }
3. 添加错误处理避免程序崩溃
用try/catch包裹异步操作,防止单个步骤出错导致整个程序停止:
async function init() { while (true) { try { const { action } = await inquirer.prompt(mainQuestions); switch(action) { case '添加员工': await addEmployee(); break; // 其他操作分支 } } catch (err) { console.error('操作失败:', err.message); } } }
通过以上调整,所有异步操作都会串行执行,主提示符只会在上一次操作完全结束后才会再次显示,不会出现叠加问题。
内容的提问来源于stack exchange,提问作者JShoe
相关产品推荐
相关产品推荐

