ES6导入错误处理

Kar*_*son 12 node.js

我目前正在使用Babel.

之前我做过以下事情require:

try {  
    var myModule = require('my-module');
} catch (err) {
    // send error to log file
}
Run Code Online (Sandbox Code Playgroud)

但是当试图这样做时import:

try {  
    import myModule from 'my-module';
} catch (err) {
    // send error to log file
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

'import'和'export'可能只出现在顶层

现在我明白这import是不同的require.从阅读是否提升ES6模块进口? import提升,这意味着在代码执行之前加载了导入.

我之前做的是,如果有任何要求失败,则会创建一个日志,通过电子邮件提醒我(将日志发送到logstash等).所以我的问题归结为以下几点.

如何在nodejs中以良好的实践方式处理导入错误?这样的事情存在吗?

Cav*_*man 16

您无法捕获静态导入错误(参见鲍里斯的回答)

但是,您可以import()为此使用动态。

它现在被所有常绿浏览器和 Node 支持,并且是自 ES2020 以来标准的一部分

class ImportError extends Error {}

const loadModule = async (modulePath) => {
  try {
    return await import(modulePath)
  } catch (e) {
    throw new ImportError(`Unable to import module ${modulePath}`)
  }
}
Run Code Online (Sandbox Code Playgroud)


Car*_*ard 6

补充动态导入

class ImportError extends Error {}

const loadModule = async (modulePath) => {
  try {
    return await import(modulePath)
  } catch (e) {
    throw new ImportError(`Unable to import module ${modulePath}`)
  }
}

async function main() {
  // import myDefault, {foo, bar} from '/modules/my-module.js'
  const { default: myDefault, foo, bar } = await loadModule('/modules/my-module.js')
}
Run Code Online (Sandbox Code Playgroud)

链式承诺

import("/modules/my-module.js").then(module=>{
  module.foo()
  module.bar()
}).catch(err=>
  console.log(err.message)
)
Run Code Online (Sandbox Code Playgroud)

解构赋值

import("/modules/my-module.js").then(({foo, bar})=>{
  foo()
  bar()
}).catch(err=>
  console.log(err.message)
)
Run Code Online (Sandbox Code Playgroud)


Bor*_*ier 5

这个演讲给出了它:https://github.com/ModuleLoader/es-module-loader/issues/280并同意你所说的.

导入仅适用于基础级别.它们是静态的,并且在模块运行之前始终加载.

所以你不能做代码检查.

但是,好消息是,由于它是静态的,可以进行分析,像webpack这样的工具会在构建时抛出错误.

  • 请注意,这个答案不再完全正确:您不能对静态导入执行此操作,但您_可以_对[动态导入]执行此操作(https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/ import#dynamic_imports) 它返回一个承诺,您可以在承诺链中使用`.catch()`,或者如果您在异步函数中,则可以`尝试await/catch`。 (2认同)