Javascript 检查node.js模块是否可用
我正在寻找一种方法来确定是否有一个模块可用 例如,我想以编程方式检查模块Javascript 检查node.js模块是否可用,javascript,node.js,Javascript,Node.js,我正在寻找一种方法来确定是否有一个模块可用 例如,我想以编程方式检查模块mongodb是否可用 另外,如果找不到模块,它不应该停止程序,我想自己处理这个问题 PS:我添加这个问题是因为谷歌没有帮助。这是我发现的最聪明的方法。如果有人有更好的方法,请指出 var mongodb; try { mongodb = require( 'mongodb' ); } catch( e ) { if ( e.code === 'MODULE_NOT_FOUND' ) { //
mongodb
是否可用
另外,如果找不到模块,它不应该停止程序,我想自己处理这个问题
PS:我添加这个问题是因为谷歌没有帮助。这是我发现的最聪明的方法。如果有人有更好的方法,请指出
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 } }
也许
resolve
-like模块在这里会有帮助
npm上存在模块的数量:
异步解析
,例如:
var Resolver = require('async-resolve');
var resolver_obj = new Resolver();
resolver_obj.resolve('module', __dirname, function(err, filename) {
return console.log(filename);
});
它使用
节点
模块路径解析规则,但不在节点
执行时阻塞主循环。结果是您得到文件名,因此可以使用它来决定其本地模块或全局模块以及其他内容。ES6简单解决方案,包含一行代码:
const path = require('path');
const fs = require('fs');
function hasDependency(dep) {
return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}
在使用自己的模块时要小心<如果嵌套请求失败,将调用代码>未找到模块。为了避免这种情况,可以在消息上使用正则表达式来检查未找到哪个模块。建议将实际错误消息打印到控制台。首先使用
require.resolve
也可以避免这种情况。如果没有找到模块,则重新显示错误不是更好吗?使用ES6 arrow函数的优点是什么?回答一个三年前的问题值得吗?@Florian Margaine箭头功能的优点是所有的工作都可以在一条线上完成,而当你在一条线上尝试/捕捉时,这不是一个优势。永远不要那样做。说真的。@Florian Margaine现在怎么办?那么使用箭头函数没有任何好处。请在答案中用一些代码注释或一些描述性文字解释你的答案。很多技能水平的人都会发现这一点,如果解释清楚的话,起诉会更容易。
const path = require('path');
const fs = require('fs');
function hasDependency(dep) {
return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}