2012-07-22 97 views
20

我正在尋找一種方法來確定模塊是否可用。檢查node.js模塊是否可用

例如,我想檢查模塊mongodb是否可用,以編程方式。

此外,它不應該停止程序,如果找不到模塊,我想自己處理這個。

PS:我添加了這個問題,因爲Google沒有幫助。

回答

19

還有一種更聰明的方式,如果你只是想檢查模塊是否可用(但如果它不是沒有加載):

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

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

這是我發現要做的最聰明的方法。如果有人有更好的辦法,請指出。

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

非常漂亮,亮。 – ShrekOverflow 2012-07-22 13:44:27

+4

小心使用你自己的模塊。如果嵌套的require失敗,將調用MODULE_NOT_FOUND。爲了避免這種情況,可以在消息中使用正則表達式來檢查未找到哪個模塊。建議將實際的錯誤消息輸出到控制檯。首先使用'require.resolve'也會避免這種情況。 – vaughan 2014-01-14 01:11:24

-8

使用ES6箭頭功能

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

使用ES6箭頭功能有什麼優勢?這是值得回答一個3年的問題嗎? – 2016-03-12 20:28:48

+1

@Florian Margaine箭頭功能的優勢在於,所有工作都可以在一行中完成 – pravdomil 2016-04-06 14:22:56

+4

當您在單行上嘗試/捕捉時,這並不是一個優勢。永遠不要這樣做。認真。 – 2016-04-06 16:15:56

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做到這一點。結果你得到的文件名,所以它可以用來決定其本地模塊或全局和其他的東西。

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

請在答案中用一些代碼註釋或一些描述性文字解釋您的答案。許多技能水平會發現這一點,如果解釋起來可能會更容易起訴。 – Brody 2017-06-06 00:38:30