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

Posted

技术标签:

【中文标题】处理 node.js 中 require() 模块抛出的错误【英文标题】:Handle errors thrown by require() module in node.js 【发布时间】:2012-10-23 06:19:22 【问题描述】:

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

这是 fs.exists() 的错误用法 (nodejs.org/api/fs.html#fs_fs_exists_path_callback) 你可能是指 fs.existsSync() 我同意@TristanShelton,这里的想法是确保所有require() 调用按预期工作应用程序的异步端开始工作之前。很确定这是存在同步函数的原因之一......但是,文档推荐access() 而不是exists(),所以也许accessSync() 在这里更合适。 是的@TristanShelron,我同意,很抱歉这个错误 这不是有竞争条件,即文件在测试它存在和尝试要求它之间会消失吗?这就是尝试和捕捉错误的全部原因......【参考方案2】:

使用包装函数:

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】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

这可行,但看起来很奇怪,还有其他解决方案吗? 我认为因为它是同步的,所以错误处理遵循这里的常规 js 模式,这通常很糟糕 有点老套,但这对我有用。文件存在 99.99% 的时间,性能至关重要,我不想承担在加载前要求 fs 检查文件的开销。

以上是关于处理 node.js 中 require() 模块抛出的错误的主要内容,如果未能解决你的问题,请参考以下文章

Node.js中的fs 模块

Node.js中require()单例

Node.js3.Node.js和commomJS规范

Node.js Domain 模块

Node.js require 方法

有没有办法取消 node.js 对 require 模块的缓存