Подтвердить что ты не робот

Обработать ошибки, вызванные модулем require() в node.js

с небольшим количеством ошибок в моем коде при попытке потребовать() модули, которые не существуют. Код проходит через каталог и делает var appname = require('path') в каждой папке. Это работает для правильно настроенных модулей, но бросает: Error: Cannot find module, когда цикл попадает в немодульный модуль.

Я хочу, чтобы обработать эту ошибку грациозно, вместо того чтобы позволить ей остановить весь процесс. Короче говоря, как можно уловить ошибку, вызванную require()?

спасибо!

4b9b3361

Ответ 1

выглядит как блок try/catch делает трюк на этом, например,

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

Ответ 2

Если заданный путь не существует, require() выдает ошибку с свойством кода, установленным в "MODULE_NOT_FOUND".

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

Так что сделайте запрос в блоке catch try и проверьте error.code == 'MODULE_NOT_FOUND'

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

Ответ 3

Используйте функцию обертки:

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

Использование:

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

На основе ответа OP конечно

Ответ 4

Если проблема связана с файлами, которые не существуют, вам следует сделать следующее:

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);
}