我正在寻找一种方法来确定模块是否可用。
例如,我想以编程方式检查模块mongodb
是否可用。
此外,如果找不到模块,它不应该暂停程序,我想自己处理。
PS:我添加了这个问题,因为Google没有帮助。
答案 0 :(得分:21)
如果您只想检查一个模块是否可用(但如果不是,则加载它),有一种更聪明的方法:
function moduleAvailable(name) {
try {
require.resolve(name);
return true;
} catch(e){}
return false;
}
if (moduleAvailable('mongodb')) {
// yeah we've got it!
}
答案 1 :(得分:11)
这是我发现的最聪明的方法。如果有人有更好的方法,请指出。
var mongodb;
try {
mongodb = require( 'mongodb' );
}
catch( e ) {
if ( e.code === 'MODULE_NOT_FOUND' ) {
// The module hasn't been found
}
}
答案 2 :(得分: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
这样做。结果你得到了文件名,所以它可以用来决定它的本地模块或全局和其他东西。
答案 3 :(得分:0)
ES6简单解决方案,包含1行代码:
const path = require('path');
const fs = require('fs');
function hasDependency(dep) {
return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}
答案 4 :(得分:-9)
使用ES6箭头功能
var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } }