我应该抓住这个承诺代码吗?

时间:2018-06-16 21:59:57

标签: javascript mysql node.js es6-promise

关于如何使用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?  
});

2 个答案:

答案 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");
    });
});
  

如果我猜测,我会说不,因为我没有在当时的方法中做错事。

假设数据库调用永远不会出错,这是不安全的。强大的编程预计在某些情况下可能会出现错误(磁盘错误,数据库磁盘卷脱机,连接池问题,查询错误等等)并正确处理该错误。