モジュールが利用可能かどうかを確認する方法を探しています。
たとえば、モジュールmongodb
がプログラムで利用可能かどうかを確認したいと思います。
また、モジュールが見つからなくてもプログラムを停止するべきではありません。これを自分で処理したいと思います。
PS:Googleは役に立たないので、この質問を追加しました。
モジュールが利用可能かどうかを確認する方法を探しています。
たとえば、モジュール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
}
}
たぶん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)));
}
ES6矢印機能の使用
var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } }