Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查node.js模块是否可用_Javascript_Node.js - Fatal编程技术网

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)));
}