如何使用Promise.all编写Node.js脚本校验环境工具是否存在
基于Promise.all的Node.js环境工具校验实现
需求说明
- 校验当前环境是否安装了docker、git、npm、nvm、node.js工具
- 已安装的工具版本输出到stdout,未安装的工具报错输出到stderr
- 执行完成后根据校验结果返回正确的进程退出码
原有代码问题说明
你当前的代码中Promise.all传入的是字符串数组而非Promise实例,因此没有实际并发执行的效果,同时也缺少退出码处理、nvm兼容逻辑。
正确实现代码
const util = require("util"); const exec = util.promisify(require("child_process").exec); // 待校验工具配置,可自由扩展 const TOOL_LIST = [ { name: "node.js", cmd: "node --version" }, { name: "docker", cmd: "docker --version" }, { name: "nvm", cmd: "bash -c 'source ~/.nvm/nvm.sh && nvm version'" }, { name: "git", cmd: "git --version" }, { name: "npm", cmd: "npm --version" } ]; /** * 单个工具校验逻辑 * @param {Object} tool 工具配置项 * @returns {Object} 校验结果 */ async function checkSingleTool(tool) { try { const { stdout } = await exec(tool.cmd); const version = stdout.trim(); console.log(`${tool.name} 版本:${version}`); return { success: true }; } catch (e) { console.error(`${tool.name} 校验失败:未安装或无法正常执行,错误信息:${e.message.trim()}`); return { success: false }; } } (async () => { // Promise.all接收Promise数组,并行执行所有工具校验 const results = await Promise.all(TOOL_LIST.map(tool => checkSingleTool(tool))); // 存在校验失败项时返回非0退出码 const hasError = results.some(item => !item.success); process.exit(hasError ? 1 : 0); })();
关键逻辑说明
- Promise.all用法:传入由所有
checkSingleTool返回的Promise实例组成的数组,并行执行所有校验任务,相比顺序执行大幅提升执行效率 - nvm兼容处理:nvm是shell函数而非全局可执行文件,需要主动加载nvm初始化脚本后再执行命令,避免出现找不到命令的误报
- 输出流区分:正常版本信息写入stdout,错误信息写入stderr,符合要求
- 退出码处理:全部校验完成后统计失败项,存在失败项时返回退出码1,全部成功返回退出码0
内容的提问来源于stack exchange,提问作者Mamuka Bzhalava
相关产品推荐
相关产品推荐

