নোড.জেএস এর ফোল্ডারে থাকা সমস্ত ফাইলের কীভাবে দরকার?
এর মতো কিছু দরকার:
files.forEach(function (v,k){
// require routes
require('./routes/'+v);
}};
নোড.জেএস এর ফোল্ডারে থাকা সমস্ত ফাইলের কীভাবে দরকার?
এর মতো কিছু দরকার:
files.forEach(function (v,k){
// require routes
require('./routes/'+v);
}};
উত্তর:
যখন প্রয়োজন হয় কোনও ফোল্ডারের পথ দেওয়া হয়, তখন that ফোল্ডারে একটি index.js ফাইল অনুসন্ধান করা হবে; যদি এটির একটি থাকে তবে এটি এটি ব্যবহার করে এবং যদি তা না থাকে তবে এটি ব্যর্থ হয়।
এটি একটি সূচক.জেএস ফাইল তৈরি করতে এবং পরে সমস্ত "মডিউল" নির্ধারণ করে এবং তারপরে কেবল এটির প্রয়োজন হবে এটি সর্বাধিক জ্ঞানযুক্ত (যদি আপনি ফোল্ডারের উপর নিয়ন্ত্রণ রাখতে পারেন) make
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'}
আমি কাজটি সম্পাদন করতে গ্লোব ব্যবহার করার পরামর্শ দিচ্ছি ।
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
ফাইল তৈরি করি যা বর্তমান ফোল্ডারের অধীনে নির্বিচারে জাভাস্ক্রিপ্টগুলি লোড করে 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
অন্য যে কোনও জায়গা থেকে এই ডিরেক্টরিটি করতে পারেন ।
আরেকটি বিকল্প হ'ল প্যাকেজটি আবশ্যক -ডির ব্যবহার করা যা আসুন আপনি নীচের কাজগুলি করুন। এটি পাশাপাশি পুনরাবৃত্তি সমর্থন করে।
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
প্রতিটি শ্রেণি রফতানি করতে ক্ষেত্রগুলিতে / সূচি.জেজে এটি ফেলে দিন:
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);
এটি মডিউলগুলিকে পাইথনের মতো আরও কার্যকর করে তোলে:
var text = new Fields.Text()
var checkbox = new Fields.Checkbox()
আরও একটি বিকল্প হ'ল সর্বাধিক জনপ্রিয় প্যাকেজগুলির সংমিশ্রণ বৈশিষ্ট্যগুলি -ডির ।
সর্বাধিক জনপ্রিয়দের 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
এনএমপি-র জন্য প্যাকেজটি তৈরি করেছিলাম । আমি এটি সহজভাবে নামকরণ করতে যাচ্ছিলাম express-map
, তবে ইয়াহুতে লোকেরা ইতিমধ্যে সেই নামের সাথে একটি প্যাকেজ রয়েছে, সুতরাং আমার প্যাকেজটির নাম পরিবর্তন করতে হয়েছিল।
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
সম্পত্তির সাথে মেলে ।
এটি কোনও ফাইল ফিল্টার নির্দিষ্ট করে এবং কীভাবে ফাইলের নামগুলি থেকে ফেরত হ্যাশগুলির কীগুলি অর্জন করতে পারে তা সুনির্দিষ্ট করে।
আমি নোডজেএস-ভিত্তিক সিস্টেমের সমস্ত ফাইলের জন্য একটি ফাইল তৈরি করতে নোড মডিউলগুলি কপি-টু মডিউল ব্যবহার করছি ।
আমাদের ইউটিলিটি ফাইলের কোডটি দেখতে এমন দেখাচ্ছে:
/**
* 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
অ্যাপ্লিকেশনটির অন্য অংশে আমদানি করতে চান তবে এটি করুন। নোট করুন যে টেমপ্লেট আক্ষরিক স্ট্যাকওভারফ্লো দ্বারা ব্যবহৃত হাইলাইটিং ইঞ্জিন দ্বারা সমর্থিত নয় যাতে কোডটি এখানে অদ্ভুত লাগবে।
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 এর সমস্ত ফাইল অন্তর্ভুক্ত করেন (" অ্যাপ্লিকেশন / lib / *। জেএস "):
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
মডিউলটির সাথে [আমি এটি তৈরিতে সহায়তা করেছি]।