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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:40:30