Inquirer生成README:renderBadge结果无法传入generateREADME求助
问题描述
我是一名训练营学员,在使用Inquirer获取输入生成README文件时遇到了问题。无法将renderBadge(license)函数的结果传入generateREADME函数,renderBadge()仅用于处理Inquirer中的许可证部分,但无法将这部分信息传递给生成函数并显示。执行函数后,模板中的${badge}显示为undefined,请问该如何解决?我哪里出错了?提前感谢!
执行结果截图

原始代码
const inquirer = require("inquirer"); const fs = require("fs"); const generateREADME = ({ title, description, installation, usage, contributions, tests, license, github, email, badge }) => `# ${title} ${badge} ## Description ${description} (Rest of Readme Generation here) ` inquirer .prompt([ { // 其他提问内容 }, { type: "list", name: "license", message: "What license is your project?", choices: [ "Apache 2.0", "Boost", "GNU AGPL v3", "MIT", "Perl", "other", ], validate: (licenseInput) => { if (licenseInput) { return true; } else { console.log(`Please enter your project's license!`); return false; } }, } ]) .then((answers) => { const readmePageContent = generateREADME(answers); renderBadge(answers) fs.writeFile('README.md', readmePageContent, (err) => { err ? console.log(err) : console.log('Successfully generated README!') }) }) function renderBadge(license) { let badge = '' if (license === 'Apache 2.0') { badge = `]` } else if (license === 'Boost') { badge = `]` } else if (license === 'GNU APGL v3') { badge = `]` } else if (license === 'MIT') { badge = `]` } else if (license === 'Perl') { badge = `]` } else { badge = '' } return badge; generateREADME(badge) }
错误原因及修复方案
错误点:
- 未将badge注入answers对象:调用
generateREADME(answers)时,answers里没有badge字段——Inquirer没收集这个数据,需要手动计算后添加进去。 - renderBadge参数处理错误:函数接收的是整个answers对象,但代码里直接把它当成license字符串判断,应该取
license.license属性。 - renderBadge内无效代码:
return badge之后的generateREADME(badge)永远不会执行,属于冗余代码。 - 条件判断拼写错误:GNU AGPL v3的判断条件写成了
GNU APGL v3,会导致该许可证的badge无法生成。 - badge格式错误:所有badge字符串末尾多了一个
],会导致图片显示异常。
修复步骤:
- 修改
renderBadge函数,接收answers对象并提取许可证值,同时修正拼写和格式问题:
function renderBadge(answers) { let badge = '' const license = answers.license; // 提取许可证值 if (license === 'Apache 2.0') { badge = `` } else if (license === 'Boost') { badge = `` } else if (license === 'GNU AGPL v3') { // 修正拼写错误 badge = `` } else if (license === 'MIT') { badge = `` } else if (license === 'Perl') { badge = `` } else { badge = '' } return badge; }
- 在then回调中,先计算badge并合并到answers,再调用generateREADME:
.then((answers) => { const badge = renderBadge(answers); // 获取生成的badge const readmePageContent = generateREADME({ ...answers, badge }); // 将badge注入answers fs.writeFile('README.md', readmePageContent, (err) => { err ? console.log(err) : console.log('Successfully generated README!') }) })
修复后完整代码
const inquirer = require("inquirer"); const fs = require("fs"); const generateREADME = ({ title, description, installation, usage, contributions, tests, license, github, email, badge }) => `# ${title} ${badge} ## Description ${description} (Rest of Readme Generation here) ` inquirer .prompt([ { // 其他提问内容 }, { type: "list", name: "license", message: "What license is your project?", choices: [ "Apache 2.0", "Boost", "GNU AGPL v3", "MIT", "Perl", "other", ], validate: (licenseInput) => { if (licenseInput) { return true; } else { console.log(`Please enter your project's license!`); return false; } }, } ]) .then((answers) => { const badge = renderBadge(answers); const readmePageContent = generateREADME({ ...answers, badge }); fs.writeFile('README.md', readmePageContent, (err) => { err ? console.log(err) : console.log('Successfully generated README!') }) }) function renderBadge(answers) { let badge = '' const license = answers.license; if (license === 'Apache 2.0') { badge = `` } else if (license === 'Boost') { badge = `` } else if (license === 'GNU AGPL v3') { badge = `` } else if (license === 'MIT') { badge = `` } else if (license === 'Perl') { badge = `` } else { badge = '' } return badge; }
内容的提问来源于stack exchange,提问作者joonkidk
相关产品推荐
相关产品推荐

