2012-11-02 75 views
33

當試圖require()模塊不存在時,在我的代碼中有一點障礙。 代碼循環瀏覽目錄,並在每個文件夾上執行var appname = require('path')。這適用於適當配置的模塊,但會在循環遇到非模塊時拋出:Error: Cannot find module處理由node.js中的require()模塊拋出的錯誤

我希望能夠優雅地處理這個錯誤,而不是讓它停止我的整個過程。總而言之,如何捕獲require()引發的錯誤?

謝謝!

+3

您已經知道答案。回答自己並接受它。 –

回答

35

看起來像一個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

這工作,但似乎很奇怪,有沒有其他解決方案? – SetupX

+3

我認爲是因爲它是同步的,錯誤處理遵循常規js模式,這通常很糟糕 – BHBH

5

使用包裝函數:

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

基於當然

11

的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; 
} 
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); 
} 
+2

這是fs.exists()的不正確用法(https://nodejs.org/api/fs.html#fs_fs_exists_path_callback)您可能是指fs .existsSync() –

+0

我同意@TristanShelton,這裏的想法是確保所有'require()'調用按預期工作*在應用程序異步端開始工作之前。很確定這是同步函數存在的原因之一......但是,文檔建議'access()'over exists()',所以可能['accessSync()'](https://nodejs.org/ dist/latest-v6.x/docs/api/fs.html#fs_fs_accesssync_path_mode)在這裏更合適。 – ZaLiTHkA

+0

是@TristanShelron,我同意,對於錯誤 –

相關問題