2012-07-22 34 views
20

मैं यह पता लगाने के लिए एक तरीका ढूंढ रहा हूं कि कोई मॉड्यूल उपलब्ध है या नहीं।जांचें कि कोई node.js मॉड्यूल उपलब्ध है

उदाहरण के लिए, मैं यह जांचना चाहता हूं कि मॉड्यूल mongodb प्रोग्रामेटिक रूप से उपलब्ध है या नहीं।

इसके अलावा, यदि कोई मॉड्यूल नहीं मिला है, तो इसे प्रोग्राम को रोकना नहीं चाहिए, मैं इसे स्वयं संभालना चाहता हूं।

पीएस: मैंने यह प्रश्न जोड़ा क्योंकि Google सहायक नहीं है।

उत्तर

19

एक अधिक चतुर तरीका नहीं है अगर आप केवल कि क्या एक मॉड्यूल उपलब्ध है की जाँच करने के (लेकिन यदि ऐसा नहीं है यह लोड नहीं) हैं:

function moduleAvailable(name) { 
    try { 
     require.resolve(name); 
     return true; 
    } catch(e){} 
    return false; 
} 

if (moduleAvailable('mongodb')) { 
    // yeah we've got it! 
} 
10

मुझे ऐसा करने का सबसे चालाक तरीका यहां दिया गया है। अगर किसी के पास ऐसा करने का बेहतर तरीका है, तो कृपया इसे इंगित करें।

var mongodb; 
try { 
    mongodb = require('mongodb'); 
} 
catch(e) { 
    if (e.code === 'MODULE_NOT_FOUND') { 
     // The module hasn't been found 
    } 
} 
+0

, बहुत अच्छा शानदार। – ShrekOverflow

+4

अपने मॉड्यूल के साथ इसका उपयोग सावधान रहें। अगर एक नेस्टेड आवश्यकता विफल हो जाती है तो 'MODULE_NOT_FOUND' कॉल किया जाएगा। इससे बचने के लिए संदेश पर एक रेगेक्स का उपयोग किया जा सकता है यह जांचने के लिए कि कौन सा मॉड्यूल नहीं मिला था। कंसोल को वास्तविक त्रुटि संदेश मुद्रित करने की सलाह दी जाएगी। पहले 'require.resolve' का उपयोग करना इससे भी बच जाएगा। – vaughan

-8

ES6 तीर कार्यों का उपयोग कर

var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } } 
+3

ES6 तीर फ़ंक्शंस का उपयोग करने का क्या फायदा है? क्या इसके लिए 3 साल का सवाल जवाब देने लायक है? –

+1

@ फ्लोरियन मार्जिन तीर कार्यों का लाभ यह है कि सभी काम एक पंक्ति – pravdomil

+4

में किया जा सकता है, जब आपके पास एक पंक्ति पर कोशिश/पकड़ने का कोई फायदा नहीं होता है। कभी मत करो। गंभीरता से। –

0

शायद resolve -like मॉड्यूल यहां मददगार होंगे?

मॉड्यूल की संख्या NPM पर मौजूद हैं:

मैं पहली बार लिखा था, async-resolve, और उदाहरण के लिए:

var Resolver = require('async-resolve'); 
var resolver_obj = new Resolver(); 
resolver_obj.resolve('module', __dirname, function(err, filename) { 
    return console.log(filename); 
}); 

यह node मॉड्यूल पथ प्रस्तावों नियमों का उपयोग लेकिन मुख्य पाश को ब्लॉक नहीं है node करते हैं। और नतीजतन आप फ़ाइल नाम प्राप्त करते हैं, इसलिए इसका उपयोग स्थानीय मॉड्यूल या वैश्विक और अन्य चीजों को तय करने के लिए किया जा सकता है। कोड की 1 लाइन के साथ

0

ES6 सरल उपाय:

const path = require('path'); 
const fs = require('fs'); 

function hasDependency(dep) { 
     return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep))); 
} 
+2

कृपया उत्तर में कुछ कोड टिप्पणियों या कुछ वर्णनात्मक पाठ के साथ अपना उत्तर समझाएं। बहुत सारे कौशल स्तर यह पाएंगे और अगर समझाया गया है तो मुकदमा करना आसान हो सकता है। – Brody

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