web-dev-qa-db-fra.com

Gérer les erreurs générées par le module require () dans node.js

avoir un petit hic dans mon code en essayant d'exiger des modules () qui n'existent pas. Le code parcourt un répertoire et effectue une var appname = require('path') sur chaque dossier. Cela fonctionne pour les modules correctement configurés mais génère: Error: Cannot find module Lorsque la boucle atteint un non-module.

Je veux pouvoir gérer cette erreur avec élégance, au lieu de la laisser arrêter tout mon processus. Donc, en bref, comment intercepter une erreur générée par require()?

merci!

57
BHBH

ressemble à un bloc try/catch fait l'affaire, par exemple.

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)
}
51
BHBH

Si le chemin d'accès n'existe pas, require () lèvera une erreur avec sa propriété de code définie sur 'MODULE_NOT_FOUND'.

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

Faites donc une demande dans un bloc try catch et vérifiez error.code == 'MODULE_NOT_FOUND'

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

Utilisez une fonction wrapper:

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

Usage:

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

Basé sur la réponse OP bien sûr

9
DaniGuardiola

Si le problème concerne des fichiers qui n'existent pas, vous devez:

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);
}
3
Mor Shemesh