UnhandledPromiseRejectionWarning 尽管进行了多次错误检查

UnhandledPromiseRejectionWarning despite multiple Error checks

我最近一直在用 NODEJS 开发一个网络应用程序。我有一个负责所有 crud 操作的数据库模型。示例数据库模型

    getDeviceList: function () {
        return new Promise(function (resolve, reject) {
            var sql = "SELECT * FROM `devices`";
            db.query(sql, function (err, result) {
                if (err) {
                    console.log(`FAILED: ${err}`);
                    reject(err);
                } else resolve(result);
            });
        });
    }

我在 DB 模块中访问这个函数,比如

router.get("/inventory/devices", checkAuth, function (req, res, next) {
    return new Promise(function (resolve, reject) {
        db.getDeviceList().then(function (result) {
            resolve(res.status(200).json(result));
        }).catch(function (err) {
            console.log(`FAILED: ${err}`);
            reject(res.status(200).json(err));
        });
    });
});

有时当我关闭数据库时;我收到 UnhandledPromiseRejectionWarning 但在我看来,我正在处理所有的承诺。处理 promise 的最佳方式是什么?我的 retrun promise 方法是否正确? 我的数据库连接块在 app.js

var connection = db.connectDB().then(function (connect) {}).catch(function (err) {
    console.log(`FAILED: ${err}`);
});

我的 connectDB()

function () {
        return new Promise(function (resolve, reject) {
            db = mysql.createPool({
                host: "localhost",
                port: 3306,
                user: "migration",
                password: "iub5015",
                database: "migration"
            });
            db.getConnection(function (err) {
                if (err) {
                    console.log(`FAILED: ${err}`);
                    reject(err);
                } else {
                    console.log("Connected");
                    resolve(db);
                }
            });
        });
    }
    router.get("/inventory/devices", checkAuth, function (req, res, next) {
    new Promise(function (resolve, reject) {
        db.getDeviceList().then(function (result) {
            resolve(result);
        }).catch(function (err) {
            console.log(`FAILED: ${err}`);
            reject(err);
        });
    }).then(r => {
        res.status(200).json(r)
     }).catch(er => {
       res.status(400).json(er)
     })
});

你的 catch 块中的最后一条语句,

reject(res.status(200).json(err));

表示 returned 承诺处于拒绝状态。即由 router.get("/inventory/devices", checkAuth, function (req, res, next) 编辑的 Promise return 处于拒绝状态,而你错过了它。 (或者 express 没有捕捉到你的情况)

这就是您收到此 UnhandledPromiseRejectionWarning.

的原因

What is the best way of handling promises and is my method of retrun promise correct?

好吧,根据我的经验,这取决于情况。在某些情况下,您可能希望通过拒绝 Promise 来传播错误,或者在某些情况下,您可能只想以某种方式处理它并将 return 某些内容作为已解决的值。在你的情况下,你可能需要查看 express 文档来弄清楚你需要如何在你的中间件中实现承诺。

router.get("/inventory/devices", checkAuth, function (req, res, next) {
    return new Promise(function (resolve, reject) {
        db.getDeviceList().then(function (result) {
            resolve(res.status(200).json(result));
        }).catch(function (err) {
            console.log(`FAILED: ${err}`);
            // This will not give UnhandledPromiseRejectionWarning 
            resolve(res.status(500).json(err));
        });
    });
});