2012-11-02 30 views
33

có một chút snag trong mã của tôi khi cố gắng yêu cầu() các mô-đun không tồn tại. Mã lặp qua một thư mục và thực hiện var appname = require('path') trên mỗi thư mục. Điều này làm việc cho các mô-đun được cấu hình phù hợp nhưng ném: Error: Cannot find module khi vòng lặp chạm vào một mô-đun không phải là mô-đun.Xử lý lỗi được ném bởi mô-đun yêu cầu() trong node.js

Tôi muốn có thể xử lý lỗi này một cách duyên dáng, thay vì để nó dừng toàn bộ quá trình của tôi. Vì vậy, trong ngắn hạn, làm thế nào để bắt một lỗi ném bởi require()?

cảm ơn!

+3

Bạn đã biết câu trả lời. Tự trả lời và chấp nhận nó. –

Trả lời

35

giống như một khối try/catch thực hiện thủ thuật này, ví dụ:

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

hoạt động nhưng có vẻ lạ, có giải pháp nào khác không? – SetupX

+3

Tôi nghĩ rằng vì nó đồng bộ, xử lý lỗi theo mẫu js thông thường ở đây thường hút – BHBH

5

Sử dụng một hàm wrapper:

function requireF(modulePath){ // force require 
    try { 
    return require(modulePath); 
    } 
    catch (e) { 
    console.log('requireF(): The file "' + modulePath + '".js could not be loaded.'); 
    return false; 
    } 
} 

Cách sử dụng:

requireF('./modules/non-existent-module'); 

Dựa trên câu trả lời OP tất nhiên

11

Nếu đường dẫn nhất định không tồn tại, yêu cầu () sẽ ném một Lỗi với thuộc tính mã của nó được đặt thành 'MODULE_NOT_FOUND'.

https://nodejs.org/api/modules.html#modules_file_modules

Vì vậy, làm một yêu cầu trong một khối try bắt và kiểm tra error.code == 'MODULE_NOT_FOUND'

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

Nếu vấn đề là với các tập tin không tồn tại, những gì bạn cần làm là:

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

Đây là cách sử dụng không chính xác của fs.exists() (https://nodejs.org/api/fs.html#fs_fs_exists_path_callback) Bạn có thể có nghĩa là fs .existsSync() –

+0

Tôi đồng ý với @TristanShelton, ý tưởng ở đây là đảm bảo tất cả các cuộc gọi 'require()' hoạt động như mong đợi * trước * phía không đồng bộ của ứng dụng bắt đầu hoạt động. Khá chắc chắn đây là một trong những lý do mà các hàm đồng bộ tồn tại ... Tuy nhiên, các tài liệu khuyến cáo 'truy cập()' trên 'tồn tại()', vì vậy có lẽ ['accessSync()'] (https://nodejs.org/ dist/latest-v6.x/docs/api/fs.html # fs_fs_accesssync_path_mode) sẽ thích hợp hơn ở đây. – ZaLiTHkA

+0

Có @TristanShelron, tôi đồng ý, xin lỗi vì sai lầm –

Các vấn đề liên quan