2013-07-09 13 views
9

Nie można znaleźć żadnych artykułów na ten temat w dowolnym miejscu. Zasadniczo chcę złapać błąd "Nie mogę znaleźć modułu" z poziomu programu i opcjonalnie poprosić o jego zainstalowanie, ale nie mogę wychwycić żadnych błędów nawet przy próbie/catch wokół moich żądań wymagających. Czy to możliwe? Nie widziałem nigdzie tego zrobionego.Złap błąd dotyczący wymaganego modułu w pliku node.js

Na przykład:

try { 
    var express = require('express'); 
} catch (err){ 
    console.log("Express is not installed."); 
    //proceed to ask if they would like to install, or quit. 
    //command to run npm install 
} 

Przypuszczam, można to zrobić z oddzielnym pliku startowego js bez 3rd party wymaga, i po prostu wykorzystuje fs aby sprawdzić node_modules, a następnie ewentualnie prowadzi npm install z procesu potomnego , następnie uruchamia node app z innym dzieckiem. Ale wydaje się, że łatwiej byłoby to zrobić z poziomu jednego pliku app.js

+1

'require' sam sugeruje, że moduł jest niezbędny do uruchomienia aplikacji. 'Nie można znaleźć modułu' jest niewymagającym wyjaśnienia komunikatem błędu, jeśli mnie o to poprosisz. Jako programista musisz uwzględnić wszystkie zależności w pakiecie, jeśli chcesz, aby inni korzystali z Twojej aplikacji. – Amberlamps

+1

@Amberlamps Zazwyczaj lepiej jest nie dostarczać zależności do aplikacji jako części pakietu, ale mieć je pobrane w momencie użycia. Aby nie dostarczać nieaktualnych/przestarzałych modułów i nie marnować miejsca. Taki jest cel 'package.json' i' npm install'. Moje poszukiwania tego rozwiązania mają na celu uczynienie mojej aplikacji jak najbardziej przyjazną dla użytkownika i automatyczną. – krb686

Odpowiedz

6

To działa dobrze dla mnie, tak jak ty. Czy na pewno nie ma folderu node_modules/express gdzieś nad tobą w systemie plików, który wymaga znalezienia? Spróbuj zrobić to być jasne, o tym, co się dzieje:

try { 
    var express = require('express'); 
    console.log("Express required with no problems", express); 
} catch (err){ 
    console.log("Express is not installed."); 
    //proceed to ask if they would like to install, or quit. 
    //command to run npm install 
} 
+0

Nie wiem, jak to zepsułem, ale usunąłem folder node_modules i wygląda na to, że działa dobrze. Dzięki. Przyjmuję twoją odpowiedź za podpowiedź, bym ją ponowił i naprawił. – krb686

16

Aby zrobić to dobrze, upewnij się, aby złapać tylko moduł nie znaleziono błędu dla danego modułu:

try { 
    var express = require('express'); 
} catch (e) { 
    if (e.code !== 'MODULE_NOT_FOUND') { 
     // Re-throw not "Module not found" errors 
     throw e; 
    } 
    if (e.message.indexOf('\'express\'') === -1) { 
     // Re-throw not found errors for other modules 
     throw e; 
    } 

} 
Powiązane problemy