當試圖require()模塊不存在時,在我的代碼中有一點障礙。 代碼循環瀏覽目錄,並在每個文件夾上執行var appname = require('path')
。這適用於適當配置的模塊,但會在循環遇到非模塊時拋出:Error: Cannot find module
。處理由node.js中的require()模塊拋出的錯誤
我希望能夠優雅地處理這個錯誤,而不是讓它停止我的整個過程。總而言之,如何捕獲require()
引發的錯誤?
謝謝!
當試圖require()模塊不存在時,在我的代碼中有一點障礙。 代碼循環瀏覽目錄,並在每個文件夾上執行var appname = require('path')
。這適用於適當配置的模塊,但會在循環遇到非模塊時拋出:Error: Cannot find module
。處理由node.js中的require()模塊拋出的錯誤
我希望能夠優雅地處理這個錯誤,而不是讓它停止我的整個過程。總而言之,如何捕獲require()
引發的錯誤?
謝謝!
使用包裝函數:
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回答如果給定的路徑不存在,需要( )會將其代碼屬性設置爲'MODULE_NOT_FOUND'時發出錯誤。
https://nodejs.org/api/modules.html#modules_file_modules
所以做一個try catch塊一個要求,檢查error.code == 'MODULE_NOT_FOUND'
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);
}
這是fs.exists()的不正確用法(https://nodejs.org/api/fs.html#fs_fs_exists_path_callback)您可能是指fs .existsSync() –
我同意@TristanShelton,這裏的想法是確保所有'require()'調用按預期工作*在應用程序異步端開始工作之前。很確定這是同步函數存在的原因之一......但是,文檔建議'access()'over exists()',所以可能['accessSync()'](https://nodejs.org/ dist/latest-v6.x/docs/api/fs.html#fs_fs_accesssync_path_mode)在這裏更合適。 – ZaLiTHkA
是@TristanShelron,我同意,對於錯誤 –
您已經知道答案。回答自己並接受它。 –