检查 node.js module是否可用

IT技术 javascript node.js
2021-03-12 05:02:11

我正在寻找一种方法来确定module是否可用。

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

此外,如果找不到module,它不应该停止程序,我想自己处理这个问题。

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

5个回答

如果您只想检查module是否可用(但如果不可用则不加载它),还有一种更聪明的方法:

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

if (moduleAvailable('mongodb')) {
    // yeah we've got it!
}

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

var mongodb;
try {
    mongodb = require( 'mongodb' );
}
catch( e ) {
    if ( e.code === 'MODULE_NOT_FOUND' ) {
        // The module hasn't been found
    }
}
如果它不是 MODULE_NOT_FOUND 时重新抛出错误,这不是更好吗?
2021-05-06 05:02:11
将它与您自己的module一起使用时要小心。MODULE_NOT_FOUND如果嵌套的 require 失败,将被调用。为了避免这种情况,可以在消息上使用正则表达式来检查未找到哪个module。建议将实际错误消息打印到控制台。使用require.resolvefirst 也可以避免这种情况。
2021-05-09 05:02:11

也许resolve-like module在这里会有所帮助?

npm 上存在的module数量:

我先写了,async-resolve例如:

var Resolver = require('async-resolve');
var resolver_obj = new Resolver();
resolver_obj.resolve('module', __dirname, function(err, filename) {
  return console.log(filename);
});

它使用nodemodule路径解析规则,但不像它那样阻塞主循环node结果你得到文件名,所以它可以用来决定它的本地module或全局和其他东西。

ES6 简单的解决方案,只有 1 行代码:

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

function hasDependency(dep) {
        return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}
请在答案中使用一些代码注释或一些描述性文字来解释您的答案。很多技能水平都会发现这一点,如果解释清楚,起诉会更容易。
2021-05-18 05:02:11

使用 ES6 箭头函数

var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } }
当您在一行上进行 try/catch 时,这不是优势。永远不要那样做。严重地。
2021-04-25 05:02:11
那么使用箭头函数就没有优势了。
2021-05-07 05:02:11
使用 ES6 箭头函数有什么好处?值得为此回答一个 3 年前的问题吗?
2021-05-12 05:02:11
@Florian Margaine 现在怎么样?
2021-05-12 05:02:11
@Florian Margaine 箭头函数的优点是所有工作都可以在一行中完成
2021-05-17 05:02:11