您可以阅读这个关于如何使用承诺的来自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?
});发布于 2018-06-16 22:14:53
当出现DB错误时,承诺将返回一个错误,此错误将不会输入到您所拥有的回调中。因此,由于您正在处理HTTP请求,如果出现DB错误,客户端将不会收到响应,最终会超时。
我建议您使用catch,因为如果存在DB错误,可以使用类似于res.status(500).send(error);的内容向客户端发送正确的错误消息。
发布于 2018-06-17 04:12:42
我应该在这个承诺代码中有一个陷阱吗?
是的,你应该这样做。如果您的数据库调用拒绝它的承诺,那么您将永远不会响应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");
});
});如果我猜的话,我会说不,因为我不会在那个方法中做一些容易出错的事情。
假设您的DB调用永远不会出现错误是不安全的。健壮的编程预计在某些情况下可能会出现错误(磁盘错误、数据库磁盘卷脱机、连接池问题、查询错误等)。并适当地处理该错误。
https://stackoverflow.com/questions/50892112
复制相似问题