Как мне требовать все файлы в папке в node.js?
нужно что-то вроде:
files.forEach(function (v,k){
// require routes
require('./routes/'+v);
}};
Как мне требовать все файлы в папке в node.js?
нужно что-то вроде:
files.forEach(function (v,k){
// require routes
require('./routes/'+v);
}};
Ответы:
Когда require указан путь к папке, он будет искать файл index.js в этой папке; если он есть, он использует его, а если его нет, он терпит неудачу.
Вероятно, было бы наиболее разумно (если у вас есть контроль над папкой) создать файл index.js, а затем назначить все «модули», а затем просто потребовать этого.
yourfile.js
var routes = require("./routes");
index.js
exports.something = require("./routes/something.js");
exports.others = require("./routes/others.js");
Если вы не знаете имен файлов, вам следует написать какой-нибудь загрузчик.
Рабочий пример загрузчика:
var normalizedPath = require("path").join(__dirname, "routes");
require("fs").readdirSync(normalizedPath).forEach(function(file) {
require("./routes/" + file);
});
// Continue application logic here
requireуказан путь к папке, он будет искать index.jsв этой папке; если он есть, он использует его, а если его нет, он терпит неудачу. См. Github.com/christkv/node-mongodb-native для реального примера этого: есть index.jsв корневом каталоге, который требует ./lib/mongodb, каталог; ./lib/mongodb/index.js'делает все остальное в этом каталоге доступным.
requireявляется синхронной функцией, поэтому нет никаких преимуществ от обратного вызова. Я бы использовал fs.readdirSync вместо этого.
package.jsonв этом каталоге. Вроде так:{main: './lib/my-custom-main-file.js'}
Я рекомендую использовать glob для выполнения этой задачи.
var glob = require( 'glob' )
, path = require( 'path' );
glob.sync( './routes/**/*.js' ).forEach( function( file ) {
require( path.resolve( file ) );
});
glob? вы имеете в виду glob-savior-of-the-nodejs-race. Лучший ответ.
Основываясь на решении @ tbranyen, я создаю index.jsфайл, который загружает произвольные javascript- коды в текущую папку как часть exports.
// Load `*.js` under current directory as properties
// i.e., `User.js` will become `exports['User']` or `exports.User`
require('fs').readdirSync(__dirname + '/').forEach(function(file) {
if (file.match(/\.js$/) !== null && file !== 'index.js') {
var name = file.replace('.js', '');
exports[name] = require('./' + file);
}
});
Тогда вы можете requireэтот каталог из любого другого места.
Другой вариант - использовать пакет require-dir, который позволит вам сделать следующее. Он также поддерживает рекурсию.
var requireDir = require('require-dir');
var dir = requireDir('./path/to/dir');
require-dirпотому что он автоматически исключает вызывающий файл (индекс) и по умолчанию использует текущий каталог. Отлично.
require-dirдобавлен filterвариант.
У меня есть папка / поля, полные файлов с одним классом каждый, например:
fields/Text.js -> Test class
fields/Checkbox.js -> Checkbox class
Перетащите это в fields / index.js для экспорта каждого класса:
var collectExports, fs, path,
__hasProp = {}.hasOwnProperty;
fs = require('fs');
path = require('path');
collectExports = function(file) {
var func, include, _results;
if (path.extname(file) === '.js' && file !== 'index.js') {
include = require('./' + file);
_results = [];
for (func in include) {
if (!__hasProp.call(include, func)) continue;
_results.push(exports[func] = include[func]);
}
return _results;
}
};
fs.readdirSync('./fields/').forEach(collectExports);
Это делает модули более похожими на Python:
var text = new Fields.Text()
var checkbox = new Fields.Checkbox()
Еще одна опция - require-dir-all, объединяющая функции большинства популярных пакетов.
Самый популярный require-dirне имеет опций для фильтрации файлов / каталогов и не имеет mapфункции (см. Ниже), но использует небольшую хитрость, чтобы найти текущий путь модуля.
Второе место по популярности require-allимеет фильтрация и предварительная обработка регулярных выражений, но не имеет относительного пути, поэтому вам нужно использовать __dirname(это имеет плюсы и минусы), например:
var libs = require('require-all')(__dirname + '/lib');
Упомянутое здесь require-indexдовольно минималистично.
С mapвы можете сделать некоторые предварительной обработку, как создавать объекты и передавать значение конфигурации (предполагая модули ниже экспорт конструкторов):
// Store config for each module in config object properties
// with property names corresponding to module names
var config = {
module1: { value: 'config1' },
module2: { value: 'config2' }
};
// Require all files in modules subdirectory
var modules = require('require-dir-all')(
'modules', // Directory to require
{ // Options
// function to be post-processed over exported object for each require'd module
map: function(reqModule) {
// create new object with corresponding config passed to constructor
reqModule.exports = new reqModule.exports( config[reqModule.name] );
}
}
);
// Now `modules` object holds not exported constructors,
// but objects constructed using values provided in `config`.
Я знаю, что этому вопросу более 5 лет, и приведенные ответы хороши, но я хотел что-то более мощное для экспресса, поэтому я создал express-map2пакет для npm. Я собирался назвать это просто express-map, однако у людей в Yahoo уже есть пакет с таким именем, поэтому мне пришлось переименовать мой пакет.
1. основное использование:
app.js (or whatever you call it)
var app = require('express'); // 1. include express
app.set('controllers',__dirname+'/controllers/');// 2. set path to your controllers.
require('express-map2')(app); // 3. patch map() into express
app.map({
'GET /':'test',
'GET /foo':'middleware.foo,test',
'GET /bar':'middleware.bar,test'// seperate your handlers with a comma.
});
использование контроллера:
//single function
module.exports = function(req,res){
};
//export an object with multiple functions.
module.exports = {
foo: function(req,res){
},
bar: function(req,res){
}
};
2. расширенное использование с префиксами:
app.map('/api/v1/books',{
'GET /': 'books.list', // GET /api/v1/books
'GET /:id': 'books.loadOne', // GET /api/v1/books/5
'DELETE /:id': 'books.delete', // DELETE /api/v1/books/5
'PUT /:id': 'books.update', // PUT /api/v1/books/5
'POST /': 'books.create' // POST /api/v1/books
});
Как видите, это экономит массу времени и упрощает написание, поддержку и понимание маршрутизации вашего приложения. он поддерживает все глаголы http, которые выражают поддержку, а также специальный .all()метод.
Один модуль, который я использовал для этого точного варианта использования, является обязательным для всех .
Он рекурсивно требует все файлы в данном каталоге и его подкаталогах, если они не соответствуют excludeDirsсвойству.
Это также позволяет указать файловый фильтр и узнать, как получить ключи возвращенного хэша из имен файлов.
Я использую модуль copy-to module модуля для создания единого файла, чтобы требовать все файлы в нашей системе на основе NodeJS.
Код для нашего служебного файла выглядит следующим образом:
/**
* Module dependencies.
*/
var copy = require('copy-to');
copy(require('./module1'))
.and(require('./module2'))
.and(require('./module3'))
.to(module.exports);
Во всех файлах большинство функций записываются как экспорты, например так:
exports.function1 = function () { // function contents };
exports.function2 = function () { // function contents };
exports.function3 = function () { // function contents };
Итак, чтобы использовать любую функцию из файла, вы просто вызываете:
var utility = require('./utility');
var response = utility.function2(); // or whatever the name of the function is
Расширяя это glob решение. Сделайте это, если вы хотите импортировать все модули из каталога в, index.jsа затем импортировать его index.jsв другую часть приложения. Обратите внимание, что литералы шаблона не поддерживаются механизмом подсвечивания, используемым stackoverflow, поэтому код здесь может выглядеть странно.
const glob = require("glob");
let allOfThem = {};
glob.sync(`${__dirname}/*.js`).forEach((file) => {
/* see note about this in example below */
allOfThem = { ...allOfThem, ...require(file) };
});
module.exports = allOfThem;
Полный пример
Структура каталогов
globExample/example.js
globExample/foobars/index.js
globExample/foobars/unexpected.js
globExample/foobars/barit.js
globExample/foobars/fooit.js
globExample / example.js
const { foo, bar, keepit } = require('./foobars/index');
const longStyle = require('./foobars/index');
console.log(foo()); // foo ran
console.log(bar()); // bar ran
console.log(keepit()); // keepit ran unexpected
console.log(longStyle.foo()); // foo ran
console.log(longStyle.bar()); // bar ran
console.log(longStyle.keepit()); // keepit ran unexpected
globExample / foobars / index.js
const glob = require("glob");
/*
Note the following style also works with multiple exports per file (barit.js example)
but will overwrite if you have 2 exports with the same
name (unexpected.js and barit.js have a keepit function) in the files being imported. As a result, this method is best used when
your exporting one module per file and use the filename to easily identify what is in it.
Also Note: This ignores itself (index.js) by default to prevent infinite loop.
*/
let allOfThem = {};
glob.sync(`${__dirname}/*.js`).forEach((file) => {
allOfThem = { ...allOfThem, ...require(file) };
});
module.exports = allOfThem;
globExample / foobars / unexpected.js
exports.keepit = () => 'keepit ran unexpected';
globExample / foobars / barit.js
exports.bar = () => 'bar run';
exports.keepit = () => 'keepit ran';
globExample / foobars / fooit.js
exports.foo = () => 'foo ran';
Изнутри проекта с glob установленным , запуститьnode example.js
$ node example.js
foo ran
bar run
keepit ran unexpected
foo ran
bar run
keepit ran unexpected
Можно использовать: https://www.npmjs.com/package/require-file-directory
Требовать все файлы из routesпапки и применять в качестве промежуточного программного обеспечения. Внешние модули не нужны.
// require
const path = require("path");
const { readdirSync } = require("fs");
// apply as middleware
readdirSync("./routes").map((r) => app.use("/api", require("./routes/" + r)));
Используя эту функцию, вам может потребоваться целый каталог.
const GetAllModules = ( dirname ) => {
if ( dirname ) {
let dirItems = require( "fs" ).readdirSync( dirname );
return dirItems.reduce( ( acc, value, index ) => {
if ( PATH.extname( value ) == ".js" && value.toLowerCase() != "index.js" ) {
let moduleName = value.replace( /.js/g, '' );
acc[ moduleName ] = require( `${dirname}/${moduleName}` );
}
return acc;
}, {} );
}
}
// calling this function.
let dirModules = GetAllModules(__dirname);
Если вы включили все файлы * .js в пример каталога ("app / lib / *. Js"):
example.js:
module.exports = function (example) { }
ПРИМЕР 2.js:
module.exports = function (example2) { }
index.js:
module.exports = require('./app/lib');
var routes = require('auto-load')('routes');с новымauto-loadмодулем [я помог создать его].