2012-07-22 7 views
20

モジュールが利用可能かどうかを調べる方法を探しています。node.jsモジュールが利用可能であることを確認してください。

たとえば、モジュールmongodbがプログラムで利用可能かどうかをチェックしたいと思います。

また、モジュールが見つからない場合はプログラムを停止してはいけません。私はこれを自分で処理したいと思います。

PS: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

@Florian Margaine矢印機能の利点は、すべての作業を1行で実行できるということです。 – pravdomil

+4

これは、1行にtry/catchがある場合には利点がありません。絶対にしないでください。真剣に。 –

0

おそらくresolveのようなモジュールはここで役に立つでしょうか?

モジュールの数は、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

関連する問題