Проверьте, доступен ли модуль 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 } }