Javascript 处理node.js中require()模块引发的错误

Javascript 处理node.js中require()模块引发的错误,javascript,node.js,error-handling,Javascript,Node.js,Error Handling,当我试图要求不存在的()模块时,代码中有一点障碍。 代码在目录中循环,并在每个文件夹上执行var-appname=require('path')。这适用于适当配置的模块,但在循环命中非模块时抛出:错误:找不到模块 我希望能够优雅地处理这个错误,而不是让它停止我的整个过程。简言之,如何捕捉由require()引发的错误 谢谢 看起来像是一个try/catch块在这方面起了作用 try { // a path we KNOW is totally bogus and not a module r

当我试图要求不存在的()模块时,代码中有一点障碍。 代码在目录中循环,并在每个文件夹上执行
var-appname=require('path')
。这适用于适当配置的模块,但在循环命中非模块时抛出:
错误:找不到模块

我希望能够优雅地处理这个错误,而不是让它停止我的整个过程。简言之,如何捕捉由
require()
引发的错误


谢谢

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

使用包装器函数:

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的回答

如果给定的路径不存在,require()将抛出一个错误,其代码属性设置为“MODULE_not_FOUND”

因此,在try-catch块中执行require并检查
error.code==“未找到模块”

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

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

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

这是可行的,但似乎很奇怪,还有其他解决方案吗?我认为,因为它是同步的,错误处理遵循常规的js模式,这通常有点糟糕,但这对我来说是可行的。99.99%的时间文件都会出现,性能是至关重要的,我不想在加载前要求fs检查文件的开销。这是对fs.exists()的错误使用。您可能是指fs.existsSync()。我同意@TristanShelton的观点,这里的想法是确保所有
require()
在应用程序的异步端开始工作之前,按预期调用work。很确定这是同步函数存在的原因之一。。。但是,文档建议使用
access()
而不是
exists()
,因此在这里可能更合适。是的@tristansherron,我同意,很抱歉弄错了。在测试文件存在和尝试要求它之间,这难道不具有竞争条件,即文件可能会消失吗?这就是我们试图抓住错误的全部原因。。。