尝试 require() 不存在的模块时,我的代码中有一些障碍。代码循环遍历一个目录并对var appname = require('path')
每个文件夹执行一次。这适用于适当配置的模块,但会抛出:Error: Cannot find module
当循环遇到非模块时。
我希望能够优雅地处理这个错误,而不是让它停止我的整个过程。简而言之,如何捕获由 引发的错误require()
?
谢谢!
尝试 require() 不存在的模块时,我的代码中有一些障碍。代码循环遍历一个目录并对var appname = require('path')
每个文件夹执行一次。这适用于适当配置的模块,但会抛出:Error: Cannot find module
当循环遇到非模块时。
我希望能够优雅地处理这个错误,而不是让它停止我的整个过程。简而言之,如何捕获由 引发的错误require()
?
谢谢!
看起来像 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)
}
如果给定的路径不存在,require() 将抛出一个错误,其代码属性设置为“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;
}
使用包装函数:
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的答案
如果问题出在不存在的文件上,您应该做的是:
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);
}