javascript - 如何使用不同模块中的嵌套承诺正确处理错误
问题描述
我是 Node JS 的新手,在使用 Promise 时我很难正确处理错误。这是我目前拥有的:
我有一个名为 db.js 的模块,它带有一个用于设置和启动数据库连接的 init 函数:
function initDb(){
return new Promise((resolve, reject) => {
if(database){
console.warn("Trying to init DB again !")
}else{
client.connect(config.db.url, {useNewUrlParser: true, useUnifiedTopology: true})
.then((client) => {
console.log("DB initialized - connected to database: " + config.db.name)
database = client.db(config.db.name)
})
.catch((err) => {
reject(err)
})
}
resolve(database)
})}
该函数将返回一个 promise,并将在 index.js 中调用它:
initDb()
.then(() => {
app.listen(8081, function () {
console.log('App is running on port 8081')
})
})
.catch((error) => {
console.log(error)
})
如您所见,我有两个捕获。一个在 db 模块中,另一个在 index.js 中
在两个地方捕获错误看起来很奇怪......在这种情况下处理错误的好模式是什么?
解决方案
您需要避免Promise
构造函数 antipattern。也不要将database
自身存储在变量中,而是存储它的承诺。
let databasePromise;
function initDb() {
if (databasePromise) {
console.debug("DB already initialised");
return databasePromise;
}
databasePromise = client.connect(config.db.url, {useNewUrlParser: true, useUnifiedTopology: true})
.then((client) => {
console.log("DB initialized - connected to database: " + config.db.name)
return client.db(config.db.name)
});
return databasePromise;
}
推荐阅读
- javascript - 从 http 响应中获取原始 url
- python - 编写脚本以仅使用基本数学函数在 SVG 中渲染线框球体?
- pandas - 从熊猫的网址中读取_csv
- spark-ar-studio - 找不到模块“场景”或其对应的类型声明 Spark AR
- angular - REST 查询字符串参数 NaN 角度
- java - 在 Junit mockMVC 中模拟空对象
- typescript - 如何在页面刷新时正确水合 NextJS 中的 Redux 状态?
- javascript - 使用 JavaScript 重定向到另一个应用程序中的 Django url
- complex-event-processing - 在 NEsper 引擎中导入事件(数据)
- laravel - Laravel:Vue组件无法识别