我最近一直在用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);
}
});
});
}
答案 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)
})
});