2011-06-18 14 views
191

द्वारा आवश्यकता या सीधे के माध्यम से बुलाया गया है, तो मैं कैसे पता लगा सकता हूं कि मेरी नोड.जेएस फ़ाइल को SH: node path-to-file या JS: require('path-to-file') का उपयोग करके कॉल किया गया था या नहीं? यहां इस बात के लिए How can I run my Perl script only if it wasn't loaded with require?नोड.जेएस: पता लगाएँ कि कमांड लाइन

+1

[node.js के पाइथन के बराबर डुप्लिकेट \ _ \ _ नाम \ _ \ _ == '\ _ \ _ मुख्य \ _ \ _'] (http://stackoverflow.com/प्रश्न/49818 9 1/नोड-जेएस-समकक्ष-के-पायथन-अगर-नाम-मुख्य) – GingerPlusPlus

उत्तर

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

दस्तावेज़ देखें: https://nodejs.org/docs/latest/api/all.html#modules_accessing_the_main_module

+0

धन्यवाद निकोलस (और जेसी) –

+2

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

+2

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

58

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

यह Node.js मेरे पिछले प्रश्न के बराबर पर्ल में है दस्तावेज़)।

var runningAsScript = !module.parent;

मैं कैसे इस बारे में अधिक जानकारी उल्लिखित this blog post में हुड के नीचे सभी काम करता है।

+0

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

+8

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

+1

मुझे दस्तावेज़ के बजाय इसका उपयोग करना था - दस्तावेज के तरीके उदाहरण के लिए काम करता है। 'node script.js' लेकिन' cat script.js नहीं node'। इस तरह दोनों के लिए काम करता है। –

2

मैं स्पष्टीकरण में उपयोग की जाने वाली शब्दावली से थोड़ा उलझन में था। तो मुझे कुछ त्वरित परीक्षण करना पड़ा।

मैंने पाया कि इन का उत्पादन एक ही परिणाम:

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

और दूसरी उलझन में लोगों के लिए (और सवाल सीधे जवाब देने के लिए):

var isCLI = require.main === module; 
var wasRequired = !isCLI; 
1
बस अजगर की तरह

, मैं हमेशा लगता है मैं यह याद रखने की कोशिश कर रहा हूं कि इस देवता कोड स्निपेट को कैसे लिखना है। तो मैंने इसके लिए एक साधारण मॉड्यूल बनाने का फैसला किया। कॉलर की मॉड्यूल की जानकारी तक पहुंचने के बाद से मुझे विकसित करने में थोड़ा सा लगा, लेकिन यह देखना मजेदार था कि यह कैसे किया जा सकता है।

तो विचार मॉड्यूल को कॉल करना और पूछना है कि कॉलर मॉड्यूल मुख्य है या नहीं। हमें कॉलर फ़ंक्शन के मॉड्यूल को समझना होगा। मेरा पहला दृष्टिकोण स्वीकृत उत्तर की एक भिन्नता थी:

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 
} 

असंभव भूल जाते हैं :-)

+0

बहुत अच्छा। मुझे यह पसंद है जब सामान्य कोड स्निपेट को एक ही नाम से संक्षिप्त किया जाता है। छोटे समायोजन: 'वापसी की ज़रूरत है। मेन/* यह अनिर्धारित है अगर हमने नोड को इंटरैक्टिव */&& requ.main.filename === callerModuleName शुरू किया; ' – masterxilo

संबंधित मुद्दे