2012-07-22 21 views
20

Estoy buscando una forma de averiguar si un módulo está disponible.Compruebe si hay un módulo node.js disponible

Por ejemplo, quiero comprobar si el módulo mongodb está disponible, programáticamente.

Además, no se debe detener el programa si no se encuentra un módulo, quiero manejarlo yo mismo.

PD: He añadido esta pregunta porque Google no es útil.

Respuesta

19

Existe una manera más inteligente si sólo desea comprobar si un módulo está disponible (pero no cargarlo si no es):

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

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

Aquí está la manera más inteligente que encontré para hacer esto. Si alguien tiene una mejor manera de hacerlo, por favor, indíquelo.

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

Muy bonito, brillante. – ShrekOverflow

+4

Tenga cuidado al usar esto con sus propios módulos. Se llamará a 'MODULE_NOT_FOUND' si falla una solicitud anidada. Para evitar esto, se podría utilizar una expresión regular en el mensaje para verificar qué módulo no se encontró. Sería aconsejable imprimir el mensaje de error real en la consola. Usar 'require.resolve' primero evitaría esto también. – vaughan

-8

uso de las funciones de dirección ES6

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

¿Cuál es la ventaja de utilizar las funciones de flecha ES6? ¿Vale la pena responder una pregunta de 3 años para esto? –

+1

@Florian Margaine la ventaja de las funciones de flecha es que todo el trabajo se puede hacer en una línea – pravdomil

+4

que no es una ventaja cuando tienes una try/catch en una sola línea. Nunca hagas eso. Seriamente. –

0

Quizás resolve -like módulos gustosamente estarán aquí?

El número de módulos son existen en NPM:

I escribió primero, async-resolve, y por ejemplo:

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

Utiliza node reglas resoluciones de trayectoria módulos pero no bloquee bucle principal como node lo hacen. Y en el resultado obtendrá un nombre de archivo, por lo que puede usarse para decidir su módulo local o global y otras cosas.

0

solución simple ES6 con 1 línea de código:

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

function hasDependency(dep) { 
     return module.paths.some(modulesPath => fs.existsSync(path.join(modulesPath, dep))); 
} 
+2

Por favor explique su respuesta con algunos comentarios del código o algún texto descriptivo en la respuesta. Muchos niveles de habilidad encontrarán esto y puede ser más fácil demandar si se explica. – Brody

Cuestiones relacionadas