【问题标题】:Handle errors thrown by require() module in node.js处理 node.js 中 require() 模块抛出的错误
【发布时间】:2012-10-23 06:19:22
【问题描述】:

在尝试 require() 不存在的模块时,我的代码中出现了一些问题。 代码循环遍历一个目录并在每个文件夹上执行var appname = require('path')。这适用于适当配置的模块,但会在循环遇到非模块时抛出:Error: Cannot find module

我希望能够优雅地处理这个错误,而不是让它停止我的整个过程。简而言之,如何捕获require() 抛出的错误?

谢谢!

【问题讨论】:

    标签: javascript node.js error-handling


    【解决方案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 检查文件的开销。
        猜你喜欢
        • 2014-05-31
        • 1970-01-01
        • 2016-06-22
        • 2021-06-05
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 2014-05-22
        • 2022-07-25
        相关资源
        最近更新 更多