我目前正在使用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
}
我收到错误:
'进口'和'出口'可能只出现在顶层
现在我了解import
与require
不同。从阅读Are ES6 module imports hoisted? import
提升,这意味着在代码执行之前加载了导入。
我之前做的是,如果有任何要求失败,则会创建一个日志,通过电子邮件提醒我(将日志发送到logstash等)。所以我的问题归结为以下几点。
如何在nodejs中以良好的实践方式处理导入错误?这样的事情存在吗?
答案 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)
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')
}
import("/modules/my-module.js").then(module=>{
module.foo()
module.bar()
}).catch(err=>
console.log(err.message)
)
import("/modules/my-module.js").then(({foo, bar})=>{
foo()
bar()
}).catch(err=>
console.log(err.message)
)