UnhandledPromiseRejectionWarning, несмотря на многочисленные проверки ошибок - PullRequest
0 голосов
/ 09 января 2020

Недавно я разрабатывал веб-приложение с NODEJS. У меня есть модель БД, которая отвечает за все грубые операции. Пример модели БД

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

И я получаю доступ к этой функции в модуле БД, как

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 ]

1 голос
/ 09 января 2020

Последний оператор в вашем блоке catch,

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

означает, что возвращенное обещание находится в отклоненном состоянии. ie Обещание, возвращенное router.get("/inventory/devices", checkAuth, function (req, res, next), находится в отклоненном состоянии, и вы пропустили это. (или express не улавливает это, как кажется в вашем случае)

Вот почему вы получаете это UnhandledPromiseRejectionWarning .

Что лучше способ обработки обещаний и мой метод повторного обещания верен?

Ну, по моему опыту, это зависит. В некоторых сценариях ios вы можете захотеть распространить ошибку, отклонив обещание, или в некоторых случаях вы можете просто захотеть обработать это каким-либо образом и вернуть что-то как разрешенное значение. В вашем случае вам, возможно, придется заглянуть в 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));
        });
    });
});
0 голосов
/ 09 января 2020
    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)
     })
});
...