web-dev-qa-db-ja.com

node.jsのrequire()モジュールによってスローされたエラーを処理します

存在しないモジュールをrequire()しようとすると、コードにちょっとした障害があります。コードはディレクトリをループし、各フォルダーでvar appname = require('path')を実行します。これは適切に構成されたモジュールに対して機能しますが、ループが非モジュールにヒットすると_Error: Cannot find module_をスローします。

プロセス全体を停止させるのではなく、このエラーを適切に処理できるようにしたいと考えています。要するに、require()によってスローされたエラーをどのようにキャッチするのでしょうか?

ありがとう!

57
BHBH

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

指定されたパスが存在しない場合、require()はコードプロパティが「MODULE_NOT_FOUND」に設定されたエラーをスローします。

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

Try catchブロックでrequireを実行し、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

ラッパー関数を使用します。

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の回答に基づいて

9
DaniGuardiola

問題が存在しないファイルにある場合、あなたがすべきことは次のとおりです。

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