如何修改fs.readdirSync代码以正确读取commands目录下子文件夹内的JS文件
Node.js fs模块递归读取子目录JS文件解决方案
错误原因
Node.js 原生 fs.readdirSync 方法不支持通配符路径解析,你传入的 ./src/commands/* 会被当作字面量路径处理,系统无法找到对应目录,因此无法读取子目录文件。
可用方案
方案1:使用内置递归参数(推荐,Node.js 12.10.0+ 支持)
无需额外依赖,直接使用fs.readdirSync官方提供的递归遍历参数即可实现子目录扫描:
const fs = require('fs'); const path = require('path'); // 开启recursive参数递归扫描所有子目录 const allFiles = fs.readdirSync('./src/commands', { recursive: true }); // 过滤出JS文件 const commandFiles = allFiles.filter(file => file.endsWith('.js')); // 可选:将相对路径转为绝对路径方便后续导入 // const commandFiles = allFiles // .filter(file => file.endsWith('.js')) // .map(file => path.resolve('./src/commands', file));
方案2:手动递归实现(兼容低版本Node.js)
如果使用的Node.js版本低于12.10.0,可以手动实现递归遍历逻辑:
const fs = require('fs'); const path = require('path'); function scanJsFiles(dir, result = []) { const items = fs.readdirSync(dir); items.forEach(item => { const fullPath = path.join(dir, item); if (fs.statSync(fullPath).isDirectory()) { // 是目录则进入递归扫描 scanJsFiles(fullPath, result); } else if (item.endsWith('.js')) { // 是JS文件则加入结果列表 result.push(fullPath); } }); return result; } const commandFiles = scanJsFiles('./src/commands');
方案3:使用glob工具(适合复杂路径匹配场景)
如果需要处理更灵活的路径匹配规则,可以使用第三方库glob:
- 安装依赖:
npm i glob
- 调用代码:
const glob = require('glob'); // ** 匹配任意层级的子目录 const commandFiles = glob.sync('./src/commands/**/*.js');
内容的提问来源于stack exchange,提问作者XTK
相关产品推荐
相关产品推荐

