2012-07-22 21 views
20

Szukam sposobu sprawdzenia, czy moduł jest dostępny. Na przykład chcę sprawdzić, czy moduł mongodb jest dostępny programowo.Sprawdź, czy dostępny jest moduł node.js

Nie powinien też zatrzymywać programu, jeśli moduł nie zostanie znaleziony, sam sobie z tym poradzę.

PS: Dodałem to pytanie, ponieważ Google nie jest pomocne.

Odpowiedz

19

Jest bardziej sprytny sposób, jeśli chcesz tylko sprawdzić, czy moduł jest dostępny (ale nie załadować go, jeśli to nie jest):

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

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

Oto najbardziej sprytny sposób, w jaki to zrobiłem. Jeśli ktokolwiek ma lepszy sposób, należy to wskazać.

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

Bardzo ładny, Brilliant. – ShrekOverflow

+4

Należy zachować ostrożność, używając tego przy użyciu własnych modułów. 'MODULE_NOT_FOUND' zostanie wywołany, jeśli nie uda się zagnieżdżone żądanie. Aby tego uniknąć, w wiadomości można użyć wyrażenia regularnego, aby sprawdzić, który moduł nie został znaleziony. Byłoby wskazane wydrukowanie faktycznego komunikatu o błędzie na konsolę. Użycie 'require.resolve' również tego uniknie. – vaughan

-8

użyciu ES6 funkcje strzałek

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

Jaka jest zaleta korzystania ze strzałek ES6? Czy warto odpowiedzieć na 3-letnie pytanie? –

+1

@Florian Margaine Zaletą funkcji strzałek jest to, że wszystkie prace można wykonać w jednej linii – pravdomil

+4

, co nie jest zaletą, gdy próbujesz/przechwytujesz w jednej linii. Nigdy tego nie rób. Poważnie. –

0

Może moduły pomocnicze będą pomocne?

Liczby moduły są istnieć NPM:

napisałem pierwszy async-resolve i na przykład:

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

Wykorzysta node moduły ścieżki uchwały zasady, ale nie blokują główną pętlę jako node zrobić. W rezultacie otrzymujesz nazwę pliku, dzięki czemu można go użyć do określenia lokalnego modułu lub globalnych i innych rzeczy.

0

ES6 proste rozwiązanie z 1 linii kodu:

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

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

Proszę wyjaśnić swoją odpowiedź, dodając kilka komentarzy do kodu lub opisowy tekst w odpowiedzi. Wiele poziomów umiejętności znajdzie to i łatwiej będzie pozwać, jeśli zostanie wyjaśnione. – Brody

Powiązane problemy