27

モジュールが利用可能かどうかを確認する方法を探しています。

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

また、モジュールが見つからなくてもプログラムを停止するべきではありません。これを自分で処理したいと思います。

PS:Googleは役に立たないので、この質問を追加しました。

4

5 に答える 5

28

モジュールが使用可能かどうかを確認するだけの場合(ただし、使用できない場合はロードしない)、より賢い方法があります。

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

if (moduleAvailable('mongodb')) {
    // yeah we've got it!
}
于 2015-10-11T17:28:18.910 に答える
16

これが私がこれを行うために見つけた最も賢い方法です。誰かがそうするためのより良い方法を持っているなら、それを指摘してください。

var mongodb;
try {
    mongodb = require( 'mongodb' );
}
catch( e ) {
    if ( e.code === 'MODULE_NOT_FOUND' ) {
        // The module hasn't been found
    }
}
于 2012-07-22T13:31:34.127 に答える
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。その結果、ファイル名が取得されるため、ローカルモジュールやグローバルなどを決定するために使用できます。

于 2016-04-22T11:27:33.943 に答える
0

1行のコードを使用したES6のシンプルなソリューション:

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

function hasDependency(dep) {
        return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}
于 2017-06-05T22:46:45.487 に答える
-9

ES6矢印機能の使用

var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } }
于 2016-03-12T19:20:11.977 に答える