检查一个node.js模块是否可用

我正在寻找一种方法来找出一个模块是否可用。

例如,我想检查模块mongodb是否可用,以编程方式。

此外,它不应该停止程序,如果一个模块没有find,我想自己处理这个。

PS:我加了这个问题,因为Google没有帮助。

如果你只想检查一个模块是否可用(但是如果不是,则不加载),有一个更聪明的方法:

 function moduleAvailable(name) { try { require.resolve(name); return true; } catch(e){} return false; } if (moduleAvailable('mongodb')) { // yeah we've got it! } 

这是我find的最聪明的方法。 如果有人有更好的办法,请指出。

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

也许类似resolve的模块在这里会有帮助吗?

模块的数量在npm上存在:

  • asynchronous决心
  • 解决
  • resolveIt
  • 增强型解决
  • 定位

我首先写了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模块path分辨率规则,但不会像node那样阻塞主循环。 结果你得到的文件名,所以它可以用来决定其本地模块或全局和其他的东西。

ES6简单的解决scheme与1行代码:

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

使用ES6箭头function

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