Проверьте, доступен ли модуль node.js
Я ищу способ узнать, доступен ли модуль.
Например, я хочу проверить, доступен ли модуль mongodb
программно.
Кроме того, он не должен останавливать программу, если модуль не найден, я хочу сам это обработать.
PS: Я добавил этот вопрос, потому что Google не помогает.
Ответы
Ответ 1
Существует более умный способ, если вы хотите только проверить, доступен ли модуль (но не загружать его, если нет):
function moduleAvailable(name) {
try {
require.resolve(name);
return true;
} catch(e){}
return false;
}
if (moduleAvailable('mongodb')) {
// yeah we've got it!
}
Ответ 2
Вот самый умный способ, который я нашел для этого. Если у кого-то есть лучший способ сделать это, пожалуйста, укажите его.
var mongodb;
try {
mongodb = require( 'mongodb' );
}
catch( e ) {
if ( e.code === 'MODULE_NOT_FOUND' ) {
// The module hasn't been found
}
}
Ответ 3
Может быть, 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
. И в результате вы получаете имя файла, поэтому его можно использовать для определения своего локального модуля или глобального и других вещей.
Ответ 4
Простое решение ES6 с 1 строкой кода:
const path = require('path');
const fs = require('fs');
function hasDependency(dep) {
return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep)));
}
Ответ 5
с использованием функций стрелок ES6
var modulePath = m => { try { return require.resolve(m) } catch(e) { return false } }