2012-07-22 17 views
20

Ich suche nach einer Möglichkeit herauszufinden, ob ein Modul verfügbar ist.Überprüfen Sie, ob ein Modul node.js verfügbar ist

Zum Beispiel möchte ich überprüfen, ob das Modul mongodb programmgesteuert verfügbar ist.

Auch sollte es nicht das Programm anhalten, wenn ein Modul nicht gefunden wird, ich möchte das selbst behandeln.

PS: Ich habe diese Frage hinzugefügt, weil Google nicht hilfreich ist.

Antwort

19

Es gibt einen besseren Weg, wenn Sie überprüfen möchten, ob ein Modul vorhanden ist (aber es nicht geladen werden, wenn es nicht ist):

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

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

Hier ist der cleverste Weg, den ich gefunden habe, dies zu tun. Wenn jemand einen besseren Weg hat, bitte darauf hinweisen.

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

Sehr schön, brillant. – ShrekOverflow

+4

Seien Sie vorsichtig damit bei Ihren eigenen Modulen. 'MODULE_NOT_FOUND' wird aufgerufen, wenn eine geschachtelte Anforderung fehlschlägt. Um dies zu vermeiden, könnte in der Nachricht ein Regex verwendet werden, um zu prüfen, welches Modul nicht gefunden wurde. Es wäre ratsam, die eigentliche Fehlermeldung auf der Konsole auszugeben. Mit 'require.resolve' würde dies ebenfalls vermieden. – vaughan

-8

mit ES6 Pfeil Funktionen

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

Was ist der Vorteil der Verwendung von ES6-Pfeilfunktionen? Lohnt es sich, eine 3 Jahre alte Frage zu beantworten? –

+1

@Florian Margaine der Vorteil der Pfeilfunktionen ist, dass alle Arbeiten in einer Zeile erledigt werden können – pravdomil

+4

das ist kein Vorteil, wenn Sie versuchen/fangen in einer einzigen Zeile. TU das niemals. Ernst. –

0

Vielleicht resolve-ähnliche Module werden hier hilfreich sein?

Die Anzahl der Module existieren auf npm:

schrieb ich zuerst, async-resolve und zum Beispiel:

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

Es node Auflösungen Module Pfadregeln verwenden, aber nicht Hauptschleife blockieren, wie node es tun. Und in Ergebnis erhalten Sie Dateinamen, so dass es verwendet werden kann, um sein lokales Modul oder globale und andere Dinge zu entscheiden.

0

ES6 einfache Lösung mit 1 Codezeile:

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

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

Bitte erläutern Sie Ihre Antwort mit einigen Code-Kommentaren oder einem beschreibenden Text in der Antwort. Viele Fertigkeitsgrade werden dies finden und es kann einfacher sein, es zu verklagen, wenn es erklärt wird. – Brody

Verwandte Themen