我正在尋找一種方法來確定模塊是否可用。檢查node.js模塊是否可用
例如,我想檢查模塊mongodb
是否可用,以編程方式。
此外,它不應該停止程序,如果找不到模塊,我想自己處理這個。
PS:我添加了這個問題,因爲Google沒有幫助。
我正在尋找一種方法來確定模塊是否可用。檢查node.js模塊是否可用
例如,我想檢查模塊mongodb
是否可用,以編程方式。
此外,它不應該停止程序,如果找不到模塊,我想自己處理這個。
PS:我添加了這個問題,因爲Google沒有幫助。
還有一種更聰明的方式,如果你只是想檢查模塊是否可用(但如果它不是沒有加載):
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
}
}
使用ES6箭頭功能
var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } }
使用ES6箭頭功能有什麼優勢?這是值得回答一個3年的問題嗎? – 2016-03-12 20:28:48
@Florian Margaine箭頭功能的優勢在於,所有工作都可以在一行中完成 – pravdomil 2016-04-06 14:22:56
當您在單行上嘗試/捕捉時,這並不是一個優勢。永遠不要這樣做。認真。 – 2016-04-06 16:15:56
也許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
做到這一點。結果你得到的文件名,所以它可以用來決定其本地模塊或全局和其他的東西。
ES6與1行代碼簡單的解決方案:
const path = require('path');
const fs = require('fs');
function hasDependency(dep) {
return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}
請在答案中用一些代碼註釋或一些描述性文字解釋您的答案。許多技能水平會發現這一點,如果解釋起來可能會更容易起訴。 – Brody 2017-06-06 00:38:30
非常漂亮,亮。 – ShrekOverflow 2012-07-22 13:44:27
小心使用你自己的模塊。如果嵌套的require失敗,將調用MODULE_NOT_FOUND。爲了避免這種情況,可以在消息中使用正則表達式來檢查未找到哪個模塊。建議將實際的錯誤消息輸出到控制檯。首先使用'require.resolve'也會避免這種情況。 – vaughan 2014-01-14 01:11:24