ES6导入错误处理

时间:2016-08-14 20:03:58

标签: node.js

我目前正在使用Babel。

我之前使用require执行了以下操作:

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

然而,尝试使用import执行此操作时:

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

我收到错误:

  

'进口'和'出口'可能只出现在顶层

现在我了解importrequire不同。从阅读Are ES6 module imports hoisted? import提升,这意味着在代码执行之前加载了导入。

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

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

4 个答案:

答案 0 :(得分:11)

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

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

它现在是 supported by all evergreen browsers & Node,并且是标准 since ES2020 的一部分。

class ImportError extends Error {}

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

答案 1 :(得分:5)

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

  

导入仅适用于基本级别。它们是静态的并且总是加载   在模块运行之前。

所以你不能进行代码检查。

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

答案 2 :(得分:0)

由于云服务正在成为常态,因此现在对此的一个非常现代的答案是让导入失败并登录到 stderr 作为云服务从 stderr 记录到其日志记录服务。所以基本上你不需要做任何事情。

答案 3 :(得分:0)

补充dynamic import

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

chained_promises

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

Destructuring assignment

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