团队生成工具Inquirer跳转异常:选Engineer后流程终止
团队资料生成工具问题排查:选择Engineer后流程终止
我是Bootcamp学员,正在开发团队资料生成工具。完成经理信息输入后,可选择添加Engineer、Intern或停止添加,但选择Engineer选项时,程序未触发对应的Inquirer输入提示,直接终止终端流程,以下是我的代码:
const inquirer = require("inquirer"); const fs = require("fs"); const path = require("path"); const Engineer = require("./lib/Engineer"); const Intern = require("./lib/Intern"); const Manager = require("./lib/Manager"); const DIST_DIR = path.resolve(__dirname, "dist"); const distPath = path.join(DIST_DIR, "team.html"); const render = require("./src/renderHTML"); let teamMembers = []; let teamIDs = []; function startApp() { function addManager() { inquirer .prompt([ { type: "input", name: "managerName", message: "What is the your name?", validate: (input) => { if (input) { return true; } else { console.log("Please enter your name to continue!"); return false; } }, }, (other questions here) ]) .then((answers) => { const manager = new Manager( answers.managerName, answers.managerID, answers.managerEmail, answers.managerOffice ); teamMembers.push(manager); teamIDs.push(answers.managerID); addTeamMember(); }); } function addTeamMember() { inquirer .prompt([ { type: "list", name: "member", message: `Select which team member you'd like to add to your team!`, choices: ["Engineer", "Intern", "No team members to add"], }, ]) .then((answers) => { switch (answers.memberChoice) { case "Engineer": generateEng(); break; case "Intern": generateInt(); break; default: makeTeam(); } }); } function generateEng() { inquirer .prompt([ { type: "input", name: "engName", message: `What is the engineer's name?`, validate: (input) => { if (input) { return true; } else { console.log("Please enter the engineer's name to continue!"); return false; } }, }, (other questions here) ]) .then((answers) => { const engineer = new Engineer( answers.engName, answers.engID, answers.engEmail, answers.engGithub ); teamMembers.push(engineer); teamIDs.push(answers.engID); addTeamMember(); }); } function generateInt() { inquirer .prompt([ { type: "input", name: "Name", message: `What is the intern's name?`, validate: (input) => { if (input) { return true; } else { console.log("Please enter the intern's name to continue!"); return false; } }, }, (other questions here) ]) .then((answers) => { const intern = new Intern( answers.intName, answers.intID, answers.intEmail, answers.intGithub ); teamMembers.push(intern); teamIDs.push(intID); addTeamMember(); }); } function makeTeam() { fs.writeFileSync(distPath, render(teamMembers), "utf-8"); } addManager(); } startApp();
问题根源与修复方案
1. 核心错误:switch判断的属性名不匹配
在addTeamMember函数中,Inquirer的列表选项name设置为member,但后续switch判断时错误使用了answers.memberChoice——这个属性根本不存在,导致所有case都不匹配,直接触发default分支执行makeTeam(),流程提前终止。
修复代码:
function addTeamMember() { inquirer .prompt([ { type: "list", name: "member", message: `Select which team member you'd like to add to your team!`, choices: ["Engineer", "Intern", "No team members to add"], }, ]) .then((answers) => { // 修正为answers.member,与选项name一致 switch (answers.member) { case "Engineer": generateEng(); break; case "Intern": generateInt(); break; default: makeTeam(); } }); }
2. 额外隐藏bug修复
除了核心问题,代码中还有几处会导致后续流程出错的问题:
- generateInt函数的输入项与取值不匹配:输入项的
name是Name,但后续用answers.intName取值,需将输入项name改为intName; - generateInt的变量未定义:
teamIDs.push(intID)中的intID未定义,需改为answers.intID; - Intern实例化参数错误:通常Intern类的第四个参数是学校而非Github,需将
answers.intGithub改为对应输入项(比如answers.intSchool),同时补充对应的Inquirer输入项。
修正后的generateInt示例:
function generateInt() { inquirer .prompt([ { type: "input", name: "intName", // 修正name属性 message: `What is the intern's name?`, validate: (input) => { if (input) { return true; } else { console.log("Please enter the intern's name to continue!"); return false; } }, }, { type: "input", name: "intID", message: `What is the intern's ID?`, validate: (input) => input ? true : (console.log("Enter an ID!"), false) }, { type: "input", name: "intEmail", message: `What is the intern's email?`, validate: (input) => input ? true : (console.log("Enter an email!"), false) }, { type: "input", name: "intSchool", // 新增学校输入项 message: `What is the intern's school?`, validate: (input) => input ? true : (console.log("Enter a school!"), false) } ]) .then((answers) => { const intern = new Intern( answers.intName, answers.intID, answers.intEmail, answers.intSchool // 修正为学校参数 ); teamMembers.push(intern); teamIDs.push(answers.intID); // 修正变量引用 addTeamMember(); }); }
内容的提问来源于stack exchange,提问作者joonkidk
相关产品推荐
相关产品推荐

