处理 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() 模块抛出的错误的主要内容,如果未能解决你的问题,请参考以下文章