モジュールが利用可能かどうかを調べる方法を探しています。node.jsモジュールが利用可能であることを確認してください。
たとえば、モジュールmongodb
がプログラムで利用可能かどうかをチェックしたいと思います。
また、モジュールが見つからない場合はプログラムを停止してはいけません。私はこれを自分で処理したいと思います。
PS:Googleが役に立たないため、この質問を追加しました。
モジュールが利用可能かどうかを調べる方法を探しています。node.jsモジュールが利用可能であることを確認してください。
たとえば、モジュールmongodb
がプログラムで利用可能かどうかをチェックしたいと思います。
また、モジュールが見つからない場合はプログラムを停止してはいけません。私はこれを自分で処理したいと思います。
PS:Googleが役に立たないため、この質問を追加しました。
はもっと賢い方法があります:
function moduleAvailable(name) {
try {
require.resolve(name);
return true;
} catch(e){}
return false;
}
if (moduleAvailable('mongodb')) {
// yeah we've got it!
}
これは私がこれを行うために見つけた最も巧妙な方法です。誰かがもっと良い方法を持っているなら、それを指摘してください。あなただけ(そうでない場合は、それをロードしない)モジュールが利用可能かどうかを確認したい場合は
var mongodb;
try {
mongodb = require('mongodb');
}
catch(e) {
if (e.code === 'MODULE_NOT_FOUND') {
// The module hasn't been found
}
}
がES6の矢印の機能を使用して
var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } }
ES6の矢印機能を使用する利点は何ですか?これは3年前の質問に答える価値がありますか? –
@Florian Margaine矢印機能の利点は、すべての作業を1行で実行できるということです。 – pravdomil
これは、1行にtry/catchがある場合には利点がありません。絶対にしないでください。真剣に。 –
おそらく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行と
ES6シンプルなソリューション:
const path = require('path');
const fs = require('fs');
function hasDependency(dep) {
return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}
答えにいくつかのコードコメントや説明文を入れて説明してください。多くのスキルレベルがこれを見つけ、それが説明されれば訴訟を起こしやすくなります。 – Brody
非常に、素敵なブリリアント。 – ShrekOverflow
独自のモジュールでこれを使用するように注意してください。 'MODULE_NOT_FOUND'はネストされた要求が失敗した場合に呼び出されます。これを避けるために、どのモジュールが見つからなかったかを調べるために正規表現をメッセージに使用することができます。実際のエラーメッセージをコンソールに出力することをお勧めします。最初に 'require.resolve'を使用するとこれも避けられます。 – vaughan