如何使用Node.js编写目录文件批量导入导出脚本?
问题描述
我希望通过同目录下的index.js文件,自动实现目录内所有文件的导入与导出。比如目录中有admin.js和user.js两个文件,期望最终导出效果如下:
module.exports = { admin: require("./admin"), users: require("./users"), };
我尝试编写了以下脚本,但无法正常运行:
fs.readdirSync(__dirname, (files) => { files.forEach((file) => { module.exports[file] = require(`./${file}`); }); });
错误原因分析
fs.readdirSync是同步读取方法,它不会接受回调函数作为参数,而是直接返回读取到的文件/文件夹数组。你传入的回调函数根本不会被执行,所以module.exports没有被正确赋值。- 未过滤掉
index.js本身和非JS文件,会导致引入自身或无效文件报错。
基础改进方案(适配单文件导入)
针对你最初的需求(导入同目录下的JS文件),可以修改成如下代码:
const fs = require('fs'); const path = require('path'); const basename = path.basename(__filename); fs.readdirSync(__dirname) .filter(file => { // 过滤隐藏文件、当前index.js,以及非.js后缀的文件 return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach(file => { // 去掉文件后缀作为导出键名 const key = path.basename(file, '.js'); module.exports[key] = require(path.join(__dirname, file)); });
说明:
- 使用
path.basename获取当前文件(index.js)的名称,避免引入自身 - 过滤规则保留非隐藏、非当前文件、后缀为
.js的文件 - 用文件名去掉后缀作为导出的键名,和你期望的
admin、users格式一致
扩展解决方案(支持文件夹导入)
你后续基于Sequelize的方案可以实现文件夹的导入导出,整理后代码及说明如下:
const fs = require('fs') const path = require('path') const basename = path.basename(__filename) const controllers = {} fs.readdirSync(__dirname) .filter(folder => { // 过滤隐藏文件夹、当前index.js文件 return folder.indexOf('.') !== 0 && folder !== basename }) .forEach(folder => { // 导入每个文件夹下的模块,以模块的name属性作为键名 const controller = require(path.join(__dirname, folder)) controllers[controller.name] = controller }) module.exports = controllers
说明:
- 此方案会读取目录下的所有文件夹(排除隐藏文件夹和当前文件)
- 导入每个文件夹对应的模块,并以模块自身的
name属性作为导出的键名 - 适合按文件夹组织模块的场景,比如控制器、模型分类
内容的提问来源于stack exchange,提问作者R41313IT
相关产品推荐
相关产品推荐

