2012-11-02 13 views
33

, który ma niewielki problem w moim kodzie, gdy próbuję wymagać() modułów, które nie istnieją. Kod wykonuje pętlę w katalogu i wykonuje w każdym folderze var appname = require('path'). Działa to dla odpowiednio skonfigurowanych modułów, ale rzuca: Error: Cannot find module, gdy pętla trafi w moduł inny niż moduł.Obsługa błędów zgłaszanych przez moduł require() w pliku node.js

Chcę być w stanie obsłużyć ten błąd z wdziękiem, zamiast pozwolić mu zatrzymać cały proces. Krótko mówiąc, w jaki sposób można złapać błąd generowany przez require()?

dziękuję!

+3

Już znasz odpowiedź. Odbierz się i zaakceptuj. –

Odpowiedz

35

wygląda jak blok try/catch, działa w tym przypadku na przykład

try { 
// a path we KNOW is totally bogus and not a module 
require('./apps/npm-debug.log/app.js') 
} 
catch (e) { 
console.log('oh no big error') 
console.log(e) 
} 
+1

to działa, ale wydaje się dziwne, czy istnieją inne rozwiązania? – SetupX

+3

Myślę, że ponieważ jest to zsynchronizowane, obsługa błędów przebiega zgodnie ze zwykłym wzorcem js, które ogólnie jest do bani – BHBH

5

Użyj funkcji otoki:

function requireF(modulePath){ // force require 
    try { 
    return require(modulePath); 
    } 
    catch (e) { 
    console.log('requireF(): The file "' + modulePath + '".js could not be loaded.'); 
    return false; 
    } 
} 

Zastosowanie:

requireF('./modules/non-existent-module'); 

podstawie OP odpowiedź oczywiście

11

Jeżeli dana ścieżka nie istnieje, require () wyrzuci błąd z właściwością code ustawioną na "MODULE_NOT_FOUND".

https://nodejs.org/api/modules.html#modules_file_modules

więc zrobić wymagać w bloku try catch i sprawdzić error.code == 'MODULE_NOT_FOUND'

var m; 
try { 
    m = require(modulePath); 
} catch (e) { 
    if (e.code !== 'MODULE_NOT_FOUND') { 
     throw e; 
    } 
    m = backupModule; 
} 
1

Jeśli problem jest z plikami, które nie istnieją, co należy zrobić, to:

let fs = require('fs'); 
let path = require('path'); 
let requiredModule = null; // or a default object {} 

let pathToModule = path.join(__dirname, /* path to module */, 'moduleName'); 
if (fs.existsSync(pathToModule)) { 
    requiredModule = require(pathToModule); 
} 

// This is in case the module is in node_modules 
pathToModule = path.join(__dirname, 'node_modules', 'moduleName'); 
if (fs.existsSync(pathToModule)) { 
    requiredModule = require(pathToModule); 
} 
+2

To jest nieprawidłowe użycie fs.exists() (https://nodejs.org/api/fs.html#fs_fs_exists_path_callback) Prawdopodobnie chodziło ci o fs .existsSync() –

+0

Zgadzam się z @TristanShelton, tutaj chodzi o to, aby wszystkie wywołania 'require()' działały zgodnie z oczekiwaniami * zanim * asynchroniczna strona aplikacji zacznie działać. Na pewno jest to jeden z powodów istnienia funkcji synchronicznych ... Jednak docs zalecają 'access()' over 'exists()', więc może ['accessSync()'] (https://nodejs.org/ dist/latest-v6.x/docs/api/fs.html # fs_fs_accesssync_path_mode) byłoby jeszcze bardziej odpowiednie tutaj. – ZaLiTHkA

+0

Tak @TristanShelron, zgadzam się, przepraszam za błąd –