2012-07-22 20 views
20

Sto cercando un modo per scoprire se un modulo è disponibile.Verifica se è disponibile un modulo node.js

Ad esempio, voglio verificare se il modulo mongodb è disponibile, a livello di programmazione.

Inoltre, non dovrebbe interrompere il programma se un modulo non viene trovato, voglio gestirlo da solo.

PS: ho aggiunto questa domanda perché Google non è utile.

risposta

19

C'è un modo più intelligente se desideri solo controllare se un modulo è disponibile (ma non caricarlo se non è):

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

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

Ecco il modo più intelligente che ho trovato per fare questo. Se qualcuno ha un modo migliore per farlo, perfavore segnalalo.

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

Molto bello, brillante. – ShrekOverflow

+4

Fare attenzione a utilizzare questo con i propri moduli. 'MODULE_NOT_FOUND' sarà chiamato se una richiesta annidata fallisce. Per evitare ciò, è possibile utilizzare un'espressione regolare sul messaggio per verificare quale modulo non è stato trovato. Sarebbe consigliabile stampare il messaggio di errore effettivo sulla console. Usare 'require.resolve' per prima cosa eviterebbe anche questo. – vaughan

-8

utilizzando le funzioni di direzione ES6

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

Qual è il vantaggio dell'uso delle funzioni freccia ES6? Vale la pena rispondere a una domanda di 3 anni per questo? –

+1

@Florian Margaine il vantaggio delle funzioni a freccia è che tutto il lavoro può essere eseguito su una riga – pravdomil

+4

che non è un vantaggio quando si prova/si cattura su una singola riga. Non farlo mai. Sul serio. –

0

Forse i moduli resolve-like saranno utili qui?

I numeri dei moduli sono presenti anche sui npm:

Ho scritto prima, async-resolve, e per esempio:

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

Si usa node moduli di guida regole risoluzioni ma non bloccare ciclo principale node farlo. E in seguito ottieni il nome del file, quindi può essere usato per decidere il suo modulo locale o globale e altre cose.

0

soluzione semplice ES6 con 1 riga di codice:

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

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

Spiegare la risposta con alcuni commenti sul codice o un testo descrittivo nella risposta. Un sacco di livelli di abilità lo troveranno e può essere più facile citare in giudizio se viene spiegato. – Brody