node.js একটি ফোল্ডারে সব ফাইল প্রয়োজন?


330

নোড.জেএস এর ফোল্ডারে থাকা সমস্ত ফাইলের কীভাবে দরকার?

এর মতো কিছু দরকার:

files.forEach(function (v,k){
  // require routes
  require('./routes/'+v);
}};

4
var routes = require('auto-load')('routes');নতুন auto-loadমডিউলটির সাথে [আমি এটি তৈরিতে সহায়তা করেছি]।
ফ্রান্সিসকো প্রেজেনসিয়া

উত্তর:


515

যখন প্রয়োজন হয় কোনও ফোল্ডারের পথ দেওয়া হয়, তখন 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

152
কিছু স্পষ্টতা যুক্ত করতে: যখন requireকোনও ফোল্ডারের পথ দেওয়া হয় , তখন সেই ফোল্ডারে এটি সন্ধান করা হবে index.js; যদি এটির একটি থাকে তবে এটি এটি ব্যবহার করে এবং যদি তা না থাকে তবে এটি ব্যর্থ হয়। এর বাস্তব-বিশ্বের উদাহরণের জন্য github.com/christkv/node-mongodb-native দেখুন : index.jsমূল ডিরেক্টরিতে ./lib/mongodbএকটি ডিরেক্টরি প্রয়োজন যা একটি ডিরেক্টরিতে রয়েছে; ./lib/mongodb/index.js'সেই ডিরেক্টরিতে থাকা সমস্ত কিছু উপলব্ধ করে।
ট্রেভর বার্নহ্যাম

22
requireসিঙ্ক্রোনাস ফাংশন তাই কলব্যাক থেকে কোনও সুবিধা নেই। আমি এর পরিবর্তে fs.readdirSync ব্যবহার করব।
রাফা সোবটা

4
ধন্যবাদ, আজ এই একই সমস্যার মধ্যে পড়ে এবং "" কেন প্রয়োজন হয় না ('./ রুটস / *')? "বলে ভেবেছিলেন।
রিচার্ড ক্লেটন

3
@ রবার্টমার্টিন এটি কার্যকর যখন আপনার কোনও রফতানি কোনও হ্যান্ডেলের প্রয়োজন হয় না; উদাহরণস্বরূপ, যদি আমি কেবল একটি এক্সপ্রেস অ্যাপ্লিকেশন উদাহরণটি ফাইলের সেটগুলিতে পাস করতে চাই যা রুটগুলি আবদ্ধ করে।
রিচার্ড ক্লেটন

2
@ ট্রেভরবার্নহ্যাম যোগ করার জন্য, এই ডিরেক্টরিতে ডিরেক্টরিটির একটি ডিরেক্টরি ফাইলের প্রধান ফাইল (অর্থাত্ index.js) পরিবর্তন করা যেতে পারে package.json। ভালো লেগেছে:{main: './lib/my-custom-main-file.js'}
অ্যান্টিটক্সিক

187

আমি কাজটি সম্পাদন করতে গ্লোব ব্যবহার করার পরামর্শ দিচ্ছি ।

var glob = require( 'glob' )
  , path = require( 'path' );

glob.sync( './routes/**/*.js' ).forEach( function( file ) {
  require( path.resolve( file ) );
});

12
প্রত্যেকের এই উত্তরটি ব্যবহার করা উচিত;)
জেমি হাবার

2
সেরা উত্তর! অন্যান্য সমস্ত বিকল্পের চেয়ে সহজ, বিশেষত পুনরাবৃত্ত-চাইল্ড ফোল্ডারগুলির জন্য যেগুলিতে আপনার অন্তর্ভুক্ত থাকা ফাইল রয়েছে।
এনজিডিফলার

1
আপনি নির্দিষ্ট করতে পারেন এমন ফাইলস্পেকের মানদণ্ডের সেটগুলির উপরে সামগ্রিক নিয়ন্ত্রণের কারণে গ্লোববিংয়ের প্রস্তাব দিন।
স্টিফেনওয়িল

6
glob? আপনি কি এটি বলতে glob-savior-of-the-nodejs-race। সেরা উত্তর.
গভীর

3
লিঙ্কগুলি সংরক্ষণের জন্য মানচিত্র () ব্যবহার করুন: কনস্ট রুটগুলি = গ্লোব.সেনসি ('./ রুটস / ** / *। জেএস') map
লেক্সা-বি

71

@ 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অন্য যে কোনও জায়গা থেকে এই ডিরেক্টরিটি করতে পারেন ।


5
আমি জানি এটি এক বছরেরও বেশি পুরানো, তবে আপনার আসলে জেএসওএন ফাইলগুলিও লাগতে পারে, তাই এর মতো সম্ভবত /\.js(on)?$/আরও ভাল কিছু হতে পারে। এছাড়াও কি !== nullঅপ্রয়োজনীয় নয় ?

59

আরেকটি বিকল্প হ'ল প্যাকেজটি আবশ্যক -ডির ব্যবহার করা যা আসুন আপনি নীচের কাজগুলি করুন। এটি পাশাপাশি পুনরাবৃত্তি সমর্থন করে।

var requireDir = require('require-dir');
var dir = requireDir('./path/to/dir');

3
+1 require-dirকারণ এটি স্বয়ংক্রিয়ভাবে কলিং ফাইল (সূচি) বাদ দেয় এবং বর্তমান ডিরেক্টরিতে ডিফল্ট হয়। পারফেক্ট।
বায়োফ্র্যাক্টাল

2
এনপিএম-এ আরও কয়েকটি অনুরূপ প্যাকেজ রয়েছে: সমস্ত-প্রয়োজন, ডিরেক্টরি-ডিরেক্টরি, প্রয়োজনীয়-দির এবং অন্যান্য। সর্বোচ্ছ ডাউনলোড হয়েছে প্রয়োজন সব, অন্তত জুলাই 2015. হবে বলে মনে হয়
Mnebuerquo

প্রয়োজনীয়-দির এখন সর্বাধিক ডাউনলোড হয়েছে (তবে উল্লেখযোগ্যভাবে এটি লেখার সময় ফাইল বর্জনকে সমর্থন করে না)
সান অ্যান্ডারসন

উপরে শানের মন্তব্যে তিন বছর পরে require-dirএকটি filterবিকল্প যুক্ত করা হয়েছে।
givemesnacks

7

আমার একক ক্লাসের প্রতিটি ফাইলের সাথে একটি ফোল্ডার / ক্ষেত্র রয়েছে, যেমন:

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()

6

আরও একটি বিকল্প হ'ল সর্বাধিক জনপ্রিয় প্যাকেজগুলির সংমিশ্রণ বৈশিষ্ট্যগুলি -ডির

সর্বাধিক জনপ্রিয়দের 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

আমি জানি এই প্রশ্নটি 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()পদ্ধতিটি।


3

এই সঠিক ব্যবহারের ক্ষেত্রে আমি যে মডিউলটি ব্যবহার করে আসছি তা হ'ল প্রয়োজনীয়

এটি যথাযথভাবে প্রদত্ত ডিরেক্টরি এবং এর উপ ডিরেক্টরিগুলির সমস্ত ফাইলের প্রয়োজন যতক্ষণ না তারা excludeDirsসম্পত্তির সাথে মেলে ।

এটি কোনও ফাইল ফিল্টার নির্দিষ্ট করে এবং কীভাবে ফাইলের নামগুলি থেকে ফেরত হ্যাশগুলির কীগুলি অর্জন করতে পারে তা সুনির্দিষ্ট করে।


2

আমি নোডজেএস-ভিত্তিক সিস্টেমের সমস্ত ফাইলের জন্য একটি ফাইল তৈরি করতে নোড মডিউলগুলি কপি-টু মডিউল ব্যবহার করছি ।

আমাদের ইউটিলিটি ফাইলের কোডটি দেখতে এমন দেখাচ্ছে:

/**
 * 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

2

এই 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

1

ব্যবহার করতে পারেন: https://www.npmjs.com/package/require-file-directory

  • কেবলমাত্র নাম বা সমস্ত ফাইল সহ নির্বাচিত ফাইলগুলির প্রয়োজন।
  • অশ্লীল পথের দরকার নেই।
  • বুঝতে এবং ব্যবহার করা সহজ।

2
এসও আপনাকে স্বাগতম। মানের উত্তর সরবরাহ করার জন্য দয়া করে এটি কীভাবে উত্তরটি পড়ুন।
ওয়েওওয়েওয়ের

1

routesফোল্ডার থেকে সমস্ত ফাইল প্রয়োজন এবং মিডওয়্যার হিসাবে প্রয়োগ করুন। কোনও বাহ্যিক মডিউলগুলির প্রয়োজন নেই।

// require
const path = require("path");
const { readdirSync } = require("fs");

// apply as middleware
readdirSync("./routes").map((r) => app.use("/api", require("./routes/" + r)));

0

এই ফাংশনটি ব্যবহার করে আপনার পুরো ডিয়ার দরকার হতে পারে।

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);

-2

যদি আপনি ডিরেক্টরি উদাহরণে ".js এর সমস্ত ফাইল অন্তর্ভুক্ত করেন (" অ্যাপ্লিকেশন / lib / *। জেএস "):

ডিরেক্টরি অ্যাপ্লিকেশন / lib এ

example.js:

module.exports = function (example) { }

যেমন-2.js:

module.exports = function (example2) { }

ডিরেক্টরি অ্যাপ্লিকেশন ইন index.js তৈরি করুন

index.js:

module.exports = require('./app/lib');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.