Node.js dosyasındaki bir klasördeki tüm dosyaları nasıl talep edebilirim?
gibi bir şeye ihtiyacım var:
files.forEach(function (v,k){
// require routes
require('./routes/'+v);
}};
Node.js dosyasındaki bir klasördeki tüm dosyaları nasıl talep edebilirim?
gibi bir şeye ihtiyacım var:
files.forEach(function (v,k){
// require routes
require('./routes/'+v);
}};
Yanıtlar:
Gereksinim bir klasörün yolu verildiğinde, o klasörde bir index.js dosyasını arar; eğer varsa, bunu kullanır ve yoksa başarısız olur.
Bir index.js dosyası oluşturmak ve daha sonra tüm "modülleri" atamak büyük olasılıkla (klasör üzerinde denetiminiz varsa) ve bu sadece bunu gerektirir.
yourfile.js
var routes = require("./routes");
index.js
exports.something = require("./routes/something.js");
exports.others = require("./routes/others.js");
Dosya adlarını bilmiyorsanız bir çeşit yükleyici yazmalısınız.
Bir yükleyicinin çalışma örneği:
var normalizedPath = require("path").join(__dirname, "routes");
require("fs").readdirSync(normalizedPath).forEach(function(file) {
require("./routes/" + file);
});
// Continue application logic here
require
klasörün yolu verildiğinde, o klasörde bir dosya arar index.js
; eğer varsa, bunu kullanır ve yoksa başarısız olur. Bunun gerçek dünya örneği için github.com/christkv/node-mongodb-native adresine bakın : index.js
Kök dizinde gereken ./lib/mongodb
bir dizin var; ./lib/mongodb/index.js'
dizindeki diğer her şeyi kullanılabilir hale getirir.
require
senkronize bir fonksiyondur, bu nedenle geri aramadan fayda sağlanmaz. Bunun yerine fs.readdirSync kullanırdım.
package.json
bu dizinde değiştirilebilir . Bunun gibi:{main: './lib/my-custom-main-file.js'}
Bu görevi yerine getirmek için glob kullanmanızı tavsiye ederim .
var glob = require( 'glob' )
, path = require( 'path' );
glob.sync( './routes/**/*.js' ).forEach( function( file ) {
require( path.resolve( file ) );
});
glob
? demek istedin glob-savior-of-the-nodejs-race
. En iyi cevap.
@ Tbranyen çözüm temel, bir index.js
parçası olarak geçerli klasör altında keyfi javascripts yükleyen bir dosya oluşturun 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);
}
});
Sonra require
bu dizini başka herhangi bir yerden yapabilirsiniz .
Başka bir seçenek, aşağıdakileri yapmanıza izin veren requir-dir paketini kullanmaktır . Özyinelemeyi de destekler.
var requireDir = require('require-dir');
var dir = requireDir('./path/to/dir');
require-dir
, çağıran dosyayı (dizin) otomatik olarak hariç tuttuğundan ve varsayılan olarak geçerli dizine geçer. Mükemmel.
require-dir
bir filter
seçenek ekledi .
Bir klasör / alanları her biri, tek bir sınıf ile dolu dosyaları var:
fields/Text.js -> Test class
fields/Checkbox.js -> Checkbox class
Her sınıfı dışa aktarmak için bunu fields / index.js alanına bırakın:
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);
Bu, modüllerin Python'daki gibi hareket etmesini sağlar:
var text = new Fields.Text()
var checkbox = new Fields.Checkbox()
Bir seçenek daha zorunlu-dir-all , en popüler paketlerin birleştiren özelliklerdir.
En popüler require-dir
dosyaları / dizinleri filtreleme seçeneklerine sahip değildir vemap
işlevi yoktur (aşağıya bakın), ancak modülün geçerli yolunu bulmak için küçük numaralar kullanır.
İkinci olarak popülerliğe require-all
göre regexp filtreleme ve önişleme vardır, ancak göreceli yoldan yoksundur, bu yüzden aşağıdaki gibi kullanmanız gerekir __dirname
(bunun artıları ve kontrasları vardır):
var libs = require('require-all')(__dirname + '/lib');
Burada bahsettiğim require-index
şey oldukça minimalist.
Bununla birlikte map
, nesne oluşturma ve yapılandırma değerlerini geçirme (dışa aktarma kurucularının altındaki modüller varsayarak) gibi bazı ön işlemler yapabilirsiniz:
// 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`.
Bu sorunun 5+ yaşında olduğunu biliyorum ve verilen cevaplar iyi, ama ekspres için biraz daha güçlü bir şey istedim, bu yüzden express-map2
npm için paket oluşturdum . Basitçe adlandıracaktım express-map
, ancak yahoo'daki insanların zaten bu adla bir paketi var, bu yüzden paketimi yeniden adlandırmak zorunda kaldım.
1. temel kullanım:
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.
});
denetleyici kullanımı:
//single function
module.exports = function(req,res){
};
//export an object with multiple functions.
module.exports = {
foo: function(req,res){
},
bar: function(req,res){
}
};
2. önekler ile gelişmiş kullanım:
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
});
Gördüğünüz gibi, bu tonlarca zaman kazandırır ve uygulamanızın yönlendirmesini yazmak, sürdürmek ve anlamak için ölü hale getirir. özel .all()
yöntemi yanı sıra destek ifade tüm http fiilleri destekler .
Bu tam kullanım durumu için kullandığım bir modül, hepsi gerektirir .
excludeDirs
Özelliğiyle eşleşmedikleri sürece belirli bir dizindeki ve alt dizinlerindeki tüm dosyaları yinelemeli olarak gerektirir .
Ayrıca bir dosya filtresi ve döndürülen karma anahtarlarının dosya adlarından nasıl türetileceğini belirtir.
NodeJS tabanlı sistemimizdeki tüm dosyaları gerektirecek tek bir dosya oluşturmak için node modülleri kopyala modülünü kullanıyorum .
Yardımcı programımızın kodu şuna benzer:
/**
* Module dependencies.
*/
var copy = require('copy-to');
copy(require('./module1'))
.and(require('./module2'))
.and(require('./module3'))
.to(module.exports);
Tüm dosyalarda, işlevlerin çoğu dışa aktarma olarak yazılır, şöyle:
exports.function1 = function () { // function contents };
exports.function2 = function () { // function contents };
exports.function3 = function () { // function contents };
Yani, bir dosyadan herhangi bir işlevi kullanmak için, sadece şunu çağırırsınız:
var utility = require('./utility');
var response = utility.function2(); // or whatever the name of the function is
Bu glob
çözüm üzerinde genişleyen . Tüm modülleri bir dizinden index.js
içe aktarmak ve ardından bunu index.js
uygulamanın başka bir bölümüne almak istiyorsanız bunu yapın . Şablon değişmezlerinin stackoverflow tarafından kullanılan vurgulama motoru tarafından desteklenmediğini ve kodun burada garip görünebileceğini unutmayın.
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;
Tam Örnek
Dizin yapısı
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
Yüklü proje içinden , çalıştırnode example.js
$ node example.js
foo ran
bar run
keepit ran unexpected
foo ran
bar run
keepit ran unexpected
Kullanabilir: https://www.npmjs.com/package/require-file-directory
routes
Klasördeki tüm dosyaları zorunlu kılın ve ara katman yazılımı olarak uygulayın. Harici modül gerekmez.
// require
const path = require("path");
const { readdirSync } = require("fs");
// apply as middleware
readdirSync("./routes").map((r) => app.use("/api", require("./routes/" + r)));
Bu işlevi kullanarak tam bir dizin gerekebilir.
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 dosyalarının tümünü dizin örneğine eklerseniz ("app / lib / *. Js"):
example.js:
module.exports = function (example) { }
Örnek-2.js:
module.exports = function (example2) { }
index.js:
module.exports = require('./app/lib');
var routes = require('auto-load')('routes');
yeniauto-load
modülle [Ben onu yaratmaya yardım ettim].