处理node.js中require()模块抛出的错误

时间:2012-11-02 15:02:06

标签: javascript node.js error-handling

在尝试require()不存在的模块时,我的代码中有一点障碍。 代码循环遍历目录,并在每个文件夹上执行var appname = require('path')。这适用于适当配置的模块,但在循环命中非模块时抛出Error: Cannot find module

我希望能够优雅地处理此错误,而不是让它停止我的整个过程。简而言之,如何捕获require()抛出的错误?

谢谢!

4 个答案:

答案 0 :(得分:48)

看起来像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)
}

答案 1 :(得分:27)

  

如果给定的路径不存在,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;
}

答案 2 :(得分:8)

使用包装函数:

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答案

答案 3 :(得分:2)

如果问题出现在不存在的文件中,您应该做的是:

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