2012-07-22 25 views
20

Bir modülün mevcut olup olmadığını öğrenmek için bir yol arıyorum. Örneğin, mongodb modülünün program aracılığıyla kullanılabilir olup olmadığını kontrol etmek istiyorum.Bir node.js modülünün mevcut olup olmadığını kontrol edin

Ayrıca, bir modül bulunamazsa, programı durdurmamalıyım, bunu kendim halletmek istiyorum.

Not: Google, yardımcı olmadığından bu soruyu ekledim.

cevap

19

daha zeki bir yolu vardır:

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

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

Bunu yapmak için bulduğum en akıllıca yol. Herhangi birinin daha iyi bir yolu varsa, lütfen bunu işaretleyin. Yalnızca (o değil ama eğer bunu yüklemez) bir modül kullanılabilir olup olmadığını kontrol etmek istiyorsanız

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

Çok güzel, parlak. – ShrekOverflow

+4

Bunu kendi modüllerinizle kullanırken dikkatli olun. Yuvalanmış bir gereksinim başarısız olursa, "MODULE_NOT_FOUND" çağrılır. Bunu önlemek için hangi modülün bulunmadığını kontrol etmek için mesajda bir regex kullanılabilir. Gerçek hata mesajını konsola yazdırmak tavsiye edilebilir. Önce 'require.resolve' kullanılması bunu da önleyecektir. – vaughan

-8

ES6 ok işlevlerini kullanarak

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

ES6 ok işlevlerini kullanmanın avantajı nedir? Bunun için 3 yıllık bir soruya cevap vermeye değer mi? –

+1

@Florian Margaine, ok işlevlerinin avantajı, tüm işlerin tek satırda yapılabilmesidir; bu, tek satırda bir deneme/yakalama yapmanız gerektiğinde bir avantaj değildir – pravdomil

+4

. Bunu asla yapma. Ciddi anlamda. –

0

Belki de resolve benzeri modüller burada yardımcı olabilir mi?

modüllerin sayılardır NPM mevcut:

Ben, ilk async-resolve yazdı ve örneğin: Bu node modülleri yol çözünürlükleri kuralları kullanabilirsiniz ama node bunu ana döngü blok yok

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

. Ve sonuçta dosya ismini alırsınız, bu yüzden yerel modülüne veya global ve diğer şeylere karar vermek için kullanılabilir. kod 1 satır ile

0

ES6 basit bir çözüm:

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

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

Lütfen cevabınızı bazı kod açıklamaları veya açıklayıcı bazı metinlerle açıklayın. Bir çok beceri seviyesi bunu bulacaktır ve açıklandığı takdirde dava açılması daha kolay olabilir. – Brody

İlgili konular