You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:15:02