এগুলির কাছে যাওয়ার বিভিন্ন উপায় রয়েছে, প্রত্যেকে তাদের নিজস্ব উপকারিতা এবং বিপরীতে:
require.main.filename
Http://nodejs.org/api/modules.html থেকে :
নোড থেকে সরাসরি কোনও ফাইল চালানো হলে require.mainসেট করা থাকে module। তার মানে আপনি পরীক্ষা করে কোনও ফাইল সরাসরি চালিত হয়েছে কিনা তা আপনি নির্ধারণ করতে পারেনrequire.main === module
যেহেতু moduleএকটি filenameসম্পত্তি সরবরাহ করে (সাধারণত সমতুল্য __filename), বর্তমান অ্যাপ্লিকেশনটির এন্ট্রি পয়েন্টটি পরীক্ষা করে পাওয়া যাবে require.main.filename।
সুতরাং আপনি যদি আপনার অ্যাপের জন্য বেস ডিরেক্টরি চান তবে আপনি এটি করতে পারেন:
var path = require('path');
var appDir = path.dirname(require.main.filename);
পেশাদাররা ও কনস
এটি বেশিরভাগ সময় দুর্দান্ত কাজ করবে তবে আপনি যদি আপনার অ্যাপ্লিকেশনটি লম্পচারের সাথে পিএম 2 এর মতো চালাচ্ছেন বা মোচা পরীক্ষা চালিয়ে যাচ্ছেন তবে এই পদ্ধতিটি ব্যর্থ হবে।
global.X
নোডে একটি বিশ্বব্যাপী নেমস্পেস বস্তু রয়েছে global- যা আপনি এই বস্তুর সাথে যুক্ত করেন তা আপনার অ্যাপ্লিকেশনের যে কোনও জায়গায় পাওয়া যাবে। সুতরাং, আপনার index.js(বা app.jsআপনার মূল অ্যাপ্লিকেশন ফাইলটির নাম যাই থাকুক না কেন), আপনি কেবল একটি গ্লোবাল ভেরিয়েবল সংজ্ঞায়িত করতে পারেন:
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
পেশাদাররা ও কনস
ধারাবাহিকভাবে কাজ করে তবে আপনাকে বিশ্বব্যাপী ভেরিয়েবলের উপর নির্ভর করতে হবে, যার অর্থ আপনি সহজেই উপাদানগুলি / ইত্যাদি পুনরায় ব্যবহার করতে পারবেন না।
process.cwd ()
এটি বর্তমান ওয়ার্কিং ডিরেক্টরিটি প্রদান করে। মোটেও নির্ভরযোগ্য নয়, কারণ প্রক্রিয়াটি কোন ডিরেক্টরি থেকে শুরু হয়েছিল তা পুরোপুরি নির্ভর করে :
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
অ্যাপ্লিকেশান-রুট-পাথ
এই সমস্যাটির সমাধানের জন্য, আমি অ্যাপ্লিকেশন-রুট-পাথ নামে একটি নোড মডিউল তৈরি করেছি । ব্যবহার সহজ:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
অ্যাপ্লিকেশান-রুট-পাথ মডিউল বিভিন্ন কৌশল ব্যবহার করে অ্যাপের রুট পাথ নির্ধারণ করতে একাউন্টে গ্লোবালি ইনস্টল্ড মডিউল (উদাহরণস্বরূপ, যদি আপনার অ্যাপে চলছে গ্রহণ /var/www/কিন্তু মডিউলে ইনস্টল করা ~/.nvm/v0.x.x/lib/node/)। এটি সময়ের 100% কাজ করবে না, তবে এটি বেশিরভাগ সাধারণ পরিস্থিতিতে কাজ করবে।
পেশাদাররা ও কনস
বেশিরভাগ পরিস্থিতিতে কনফিগারেশন ছাড়াই কাজ করে। এছাড়াও কিছু দুর্দান্ত অতিরিক্ত সুবিধার পদ্ধতি সরবরাহ করে (প্রকল্প পৃষ্ঠা দেখুন)। সবচেয়ে বড় কন এটি কাজ করবে না যদি:
- আপনি দুপুর ২ টার মতো লঞ্চার ব্যবহার করছেন
- এবং , মডিউলটি আপনার অ্যাপ্লিকেশনটির
node_modulesডিরেক্টরিতে ইনস্টল করা হয়নি (উদাহরণস্বরূপ, আপনি যদি এটি বিশ্বব্যাপী ইনস্টল করেন)
আপনি APP_ROOT_PATHপরিবেশগত পরিবর্তনশীল সেট করে , বা .setPath()মডিউলটি কল করে এটি পেতে পারেন , তবে সেক্ষেত্রে আপনি সম্ভবত এটি ব্যবহার করে আরও ভালglobal পদ্ধতিটি ।
NODE_PATH পরিবেশগত পরিবর্তনশীল
আপনি যদি বর্তমান অ্যাপের মূল পাথ নির্ধারণের জন্য কোনও উপায় সন্ধান করছেন , উপরের সমাধানগুলির মধ্যে একটি আপনার পক্ষে ভাল কাজ করার সম্ভাবনা রয়েছে। অন্যদিকে, আপনি অ্যাপ্লিকেশন মডিউলগুলি নির্ভরযোগ্যভাবে লোড করার সমস্যাটি সমাধান করার চেষ্টা করছেন, আমি NODE_PATHপরিবেশগত পরিবর্তনশীলটি সন্ধানের জন্য সুপারিশ করছি ।
নোডের মডিউল সিস্টেম বিভিন্ন স্থানে মডিউলগুলির সন্ধান করে। এই অবস্থানগুলির মধ্যে একটি যেখানেই process.env.NODE_PATHপয়েন্ট রয়েছে । আপনি যদি এই পরিবেশগত পরিবর্তনশীল সেট করে থাকেন তবে আপনি requireঅন্য কোনও পরিবর্তন ছাড়াই মানক মডিউল লোডার সহ মডিউলগুলি পারেন ।
উদাহরণস্বরূপ, যদি আপনি সেট NODE_PATHকরার জন্য /var/www/libনিম্নলিখিত ঠিক সূক্ষ্ম কাজ করবে:
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
এটি করার একটি দুর্দান্ত উপায় হ'ল npm:
"scripts": {
"start": "NODE_PATH=. node app.js"
}
এখন আপনি আপনার অ্যাপ্লিকেশনটি শুরু করতে পারেন npm startএবং আপনি সোনার। আমি এটিকে আমার প্রয়োগ-নোড-পাথ মডিউলটির সাথে একত্রিত করি , যা দুর্ঘটনাক্রমে কোনও NODE_PATHসেট ছাড়াই অ্যাপ লোড করা রোধ করে। পরিবেশগত পরিবর্তনশীল প্রয়োগের জন্য আরও নিয়ন্ত্রণের জন্য, চেকেনভ দেখুন ।
একটি গোছা: NODE_PATH অবশ্যই নোড অ্যাপের বাইরে সেট করা উচিত । আপনি যেমন কিছু করতে পারবেন নাprocess.env.NODE_PATH = path.resolve(__dirname) কারণ মডিউল লোডার আপনার অ্যাপ্লিকেশনটি চালানোর আগে ডিরেক্টরিগুলির তালিকাকে ক্যাশে করে।
[4/6/16 যোগ] আরেকটি সত্যিই প্রতিশ্রুতি মডিউল সমাধানের জন্য যে প্রচেষ্টা এই সমস্যা হয় তরঙ্গায়িত ।