尽管进行了多次错误检查,但仍出现UnhandledPromiseRejectionWarning

时间:2020-01-09 03:42:49

标签: javascript node.js promise node-mysql request-promise

我最近一直在用NODEJS开发一个Web应用程序。我有一个数据库模型,可以处理所有原始操作。示例数据库模型

    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 ,但在我眼中,我正在兑现所有承诺。兑现承诺的最佳方法是什么?我的重新运行承诺方法正确吗? 我的数据库连接块在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);
                }
            });
        });
    }

2 个答案:

答案 0 :(得分:1)

catch块中的最后一条语句,

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

表示返回的承诺处于拒绝状态。即router.get("/inventory/devices", checkAuth, function (req, res, next)返回的Promise处于拒绝状态,您错过了。 (或快递无法像您看到的那样捕捉到这一点)

这就是为什么您得到此 UnhandledPromiseRejectionWarning 的原因。

最好的处理承诺的方法是什么,我的重做方法是什么 保证正确?

根据我的经验,这取决于。在某些情况下,您可能希望通过拒绝Promise来传播错误,或者在某些情况下,您可能只想以某种方式处理它并返回某些值作为已解决的值。在您的情况下,您可能需要研究快速文档,以了解如何在中间件中实现Promise。

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

答案 1 :(得分:-1)

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