पता लगाएँ कि क्या आवश्यकता है या सीधे कमांड लाइन द्वारा


298

मैं कैसे पता लगा सकता हूं कि मेरी Node.JS फाइल को SH: node path-to-fileया JS: का उपयोग करके बुलाया गया था या नहीं require('path-to-file')?

यह पर्ल में मेरे पिछले प्रश्न के समतुल्य Node.JS है: मैं अपनी पर्ल स्क्रिप्ट को केवल तभी चला सकता हूं जब वह आवश्यकता से लोड न हो?


जवाबों:


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_the_main_module


3
क्या इसके आसपास पाने के लिए कोई रास्ता नहीं है? मेरे पास कोड है (जिसका मेरे पास नियंत्रण नहीं है) जो ऐसा करता है, लेकिन मुझे इसकी आवश्यकता है () है और यह ऐसा कार्य करता है जैसे कि इसे सीधे कहा जाता है। मूल रूप से, मुझे उस चीज़ को मूर्ख बनाने की ज़रूरत है जो उस परीक्षण का उपयोग सोच में करता है जिसे सीधे कहा जाता था।
केविन

2
@ केविन मुझे इसके साथ करने के बारे में नहीं पता है require(), लेकिन आप शायद इसे फ़ाइल आयात करने के साथ कर सकते हैं, फिर इस evalपर चल सकते हैं, या चलाकरrequire('child_process').exec('node the_file.js')
MalcolmOcean

Node.js के साथ ES मॉड्यूल का उपयोग करते समय, आप यह es-mainजांचने के लिए पैकेज का उपयोग कर सकते हैं कि क्या कोई मॉड्यूल सीधे चलाया गया था।
तैमूर शाब

91

एक और छोटा तरीका है (उल्लिखित डॉक्स में उल्लिखित नहीं)।

var runningAsScript = !module.parent;

मैंने इस ब्लॉग पोस्ट में हड के तहत कैसे काम करता है, इसके बारे में अधिक विवरणों को रेखांकित किया ।


+1, मुझे यह बेहतर लगता है, लेकिन मैं स्वीकृत उत्तरों को बदलने से पहले संकोच करूंगा। :)
ब्रायन फील्ड

8
जैसा कि मैंने संकेत दिया, आधिकारिक तरीका जो प्रलेखित है वह एक @nicolaskruchten उल्लिखित है। यह सिर्फ एक विकल्प है, स्वीकार किए गए उत्तर को स्विच करने की कोई आवश्यकता नहीं है। दोनों कार्य।
थोरस्टेन लॉरेंज

10
मुझे इसका उपयोग प्रलेखित तरीके के बजाय करना था - जैसे कि प्रलेखित तरीका काम करता है। 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 फ़ाइल में यह जाँचने की आवश्यकता है
datdinhquoc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.