প্রয়োজন বা সরাসরি কমান্ড লাইনের মাধ্যমে ডাকলে সনাক্ত করুন ct


298

আমার নোড.জেএস ফাইলটি এসএইচ: node path-to-fileবা জেএস: ব্যবহার করে কল করা হয়েছিল কিনা তা আমি কীভাবে সনাক্ত করতে পারি require('path-to-file')?

এটি পার্লের আমার পূর্ববর্তী প্রশ্নের সমান নোড.জেএস: আমার পার্ল স্ক্রিপ্টটি কেবলমাত্র প্রয়োজনীয় লোড না হলে কীভাবে চালাতে পারি?


উত্তর:


471
if (require.main === module) {
    console.log('called directly');
} else {
    console.log('required as a module');
}

এখানে এর জন্য ডকুমেন্টেশন দেখুন: https://nodejs.org/docs/latest/api/modules.html#modules_accessing_t__main_module


3
এই সমস্যা এড়ানোর পেতে কোন উপায় আছে কি? আমার কোড রয়েছে (যার উপরে আমার নিয়ন্ত্রণ নেই) এটি করে তবে আমার এটি প্রয়োজন () দরকার এবং এটি সরাসরি ডাকা হয়েছে বলে মনে হয় এটি কাজ করা উচিত। মূলত, আমাকে এমন কিছু বোকা বানাতে হবে যা এই পরীক্ষাটিকে সরাসরি ডাকা হয়েছিল তা ভেবে চিন্তায় ফেলে।
কেভিন

2
@ কেভিন আমি এটি দিয়ে কাজ করার বিষয়ে জানিনা require(), তবে আপনি হয়ত ফাইলটি আমদানি করে তারপরে চালিয়ে evalবা চালিয়ে যেতে পারেনrequire('child_process').exec('node the_file.js')
ম্যালকোমোসিয়ান

নোড.জেএস সহ ইএস মডিউলগুলি ব্যবহার করার সময়, es-mainমডিউলটি সরাসরি চালিত হয়েছে কিনা তা পরীক্ষা করতে আপনি প্যাকেজটি ব্যবহার করতে পারেন ।
টিম স্কাউব

91

আর একটি, সামান্য খাটো উপায় আছে (উল্লিখিত ডক্সগুলিতে বর্ণিত নয়)।

var runningAsScript = !module.parent;

আমি এই ব্লগ পোস্টে হুডের অধীনে এই সমস্ত কীভাবে কাজ করে সে সম্পর্কে আরও বিশদরেখার বাইরে রইলাম ।


+1, আমি এটি আরও ভাল পছন্দ করি তবে গ্রহণযোগ্য উত্তরগুলি স্যুইচ করার আগে আমি দ্বিধা করব। :)
ব্রায়ান ফিল্ড

8
আমি যেমনটি ইঙ্গিত করেছি, দাপ্তরিক সরকারী উপায়টি হ'ল @nicolaskruchten এর রূপরেখা উল্লেখ করা হয়েছে। এটি কেবলমাত্র একটি বিকল্প, গৃহীত উত্তরগুলি স্যুইচ করার দরকার নেই। দুটোই কাজ করে।
থারস্টেন লরেঞ্জ

10
ডকুমেন্টেড উপায়ের পরিবর্তে আমাকে এটি ব্যবহার করতে হয়েছিল - ডকুমেন্টেড উপায় যেমন কাজ করে works node script.jsকিন্তু না cat script.js | node। এই ভাবে উভয় জন্য কাজ করে।
টিম ম্যালোন

9

ব্যাখ্যা (গুলি) এ ব্যবহৃত পরিভাষা দেখে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম। তাই আমাকে বেশ কয়েকটি দ্রুত পরীক্ষা করতে হয়েছিল।

আমি দেখতে পেয়েছি যে এগুলি একই ফলাফল দেয়:

var isCLI = !module.parent;
var isCLI = require.main === module;

এবং অন্যান্য বিভ্রান্ত ব্যক্তিদের জন্য (এবং সরাসরি প্রশ্নের উত্তর দেওয়ার জন্য):

var isCLI = require.main === module;
var wasRequired = !isCLI;

5

পাইথনের মতোই, আমি সর্বদা নিজেকে এই গডড্যামন কোড স্নিপেট কীভাবে লিখব তা মনে করার চেষ্টা করি। সুতরাং আমি এটির জন্য একটি সাধারণ মডিউল তৈরি করার সিদ্ধান্ত নিয়েছি। কলারের মডিউল তথ্য অ্যাক্সেস করা সোজাসাপ্টা নয়, তবে এটি কীভাবে করা যায় তা মজাদার হয়েছিল।

সুতরাং ধারণাটি হল একটি মডিউলকে কল করা এবং কলার মডিউলটি মূল কিনা এটি জিজ্ঞাসা করা। আমাদের কলার ফাংশনের মডিউলটি বের করতে হবে। আমার প্রথম পদ্ধতির গ্রহণযোগ্য উত্তরের একটি পরিবর্তন ছিল:

module.exports = function () {
    return require.main === module.parent;
};

তবে এটি কাজের গ্যারান্টিযুক্ত নয়। module.parentমডিউলটি নির্দেশ করে যা আমাদের স্মৃতিতে লোড করে, আমাদের ডাকে এমনটি নয়। যদি এটি কলার মডিউলটি ছিল যা এই সহায়ক মডিউলটিকে মেমরিতে লোড করেছে, ঠিক আছে। তবে তা না হলে আমরা অসহায়। সুতরাং আমাদের অন্য কিছু চেষ্টা করা দরকার। আমার সমাধানটি ছিল একটি স্ট্যাক ট্রেস তৈরি করা এবং সেখান থেকে কলারের মডিউলটির নাম পাওয়া:

module.exports = function () {
    // generate a stack trace
    const stack = (new Error()).stack;
    // the third line refers to our caller
    const stackLine = stack.split("\n")[2];
    // extract the module name from that line
    const callerModuleName = /\((.*):\d+:\d+\)$/.exec(stackLine)[1];

    return require.main.filename === callerModuleName;
};

এখন আমরা করতে পারি:

if (require("./is-main-module")()) {  // notice the `()` at the end
    // do something
} else {
    // do something else
}

বা আরও পাঠযোগ্য:

const isMainModule = require("./is-main-module");

if (isMainModule()) {
    // do something
} else {
    // do something else
}

ভোলা অসম্ভব :-)


2
খুব ঠান্ডা. আমি এটিকে পছন্দ করি যখন সাধারণ কোড স্নিপেটগুলি একক নামের সাথে সংক্ষেপিত হয়। ছোট সামঞ্জস্য:return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
মাস্টারেক্সিলো

4

আপনি যদি ES6 মডিউল ব্যবহার করছেন তবে এটি ব্যবহার করে দেখুন:

if (process.mainModule.filename === __filename) {
  console.log('running as main module')
}

2
বিষ্ঠা, আমার process.mainModuleহলundefined
datdinhquoc

1
GHOSHHHH, আমার এটি আমার .mjs ফাইলে পরীক্ষা করা দরকার
ডাটদিনহোকোক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.