首页 > 解决方案 > 如何使用不同模块中的嵌套承诺正确处理错误

问题描述

我是 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 中

在两个地方捕获错误看起来很奇怪......在这种情况下处理错误的好模式是什么?

标签: javascriptnode.jsexpresserror-handlingpromise

解决方案


您需要避免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;
}

推荐阅读