关于如何使用promises,请阅读此article here from MDN。
我清楚地检查了数据库查询中的错误,但在使用数据库时我是否应该在catch
之后使用then
?
数据库
const pool = mysql.createPool(helper.getMySQL());
const queryMaker = (query) => {
return new Promise ((resolve, reject) => {
pool.query(query, (error, results, fields) => {
error ? reject(error) : resolve(results, fields);
});
});
};
exports.selectAllDomains = () => {
const query = `some mysql query`;
return queryMaker(query);
};
使用案例
router.route('/items').get((req, res) => {
MySQL.selectAllDomains().then((results) => {
if(req.user){
results[results.length] = req.user;
}
res.status(200).json(results);
});
// Should I have a catch here?
});
答案 0 :(得分:1)
当出现数据库错误时,promise将返回错误,并且此错误不会进入您拥有的回调。因此,如果您在处理HTTP请求时遇到数据库错误,那么客户端将不会收到响应并最终会超时。
我建议您使用catch,因为如果出现数据库错误,您可以使用res.status(500).send(error);
答案 1 :(得分:1)
我应该抓住这个承诺代码吗?
是的,你应该。如果您的数据库调用拒绝其承诺,那么您永远不会响应http请求,该请求只会坐在那里没有响应发送,并最终会超时。除了未能及时向客户端发送响应之外,这还会在超时期间消耗服务器资源。如果存在一些临时数据库故障,这可能会导致大量请求堆积,直到它们超时,这可能耗尽服务器上的资源。
相反,您需要捕获错误并立即向http请求返回错误响应。
router.route('/items').get((req, res) => {
MySQL.selectAllDomains().then((results) => {
if(req.user){
results[results.length] = req.user;
}
res.status(200).json(results);
}).catch(err => {
console.log(err);
res.status(500).send("database internal error");
});
});
如果我猜测,我会说不,因为我没有在当时的方法中做错事。
假设数据库调用永远不会出错,这是不安全的。强大的编程预计在某些情况下可能会出现错误(磁盘错误,数据库磁盘卷脱机,连接池问题,查询错误等等)并正确处理该错误。