首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在这个承诺代码中有一个陷阱吗?

我应该在这个承诺代码中有一个陷阱吗?
EN

Stack Overflow用户
提问于 2018-06-16 21:59:56
回答 2查看 60关注 0票数 1

您可以阅读这个关于如何使用承诺的来自MDN的文章

我清楚地检查了我的数据库查询中的错误,但是当我使用数据库时,是否也应该在catch之后使用then呢?

数据库

代码语言:javascript
复制
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);
};

用例

代码语言:javascript
复制
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?  
});
EN

回答 2

Stack Overflow用户

发布于 2018-06-16 22:14:53

当出现DB错误时,承诺将返回一个错误,此错误将不会输入到您所拥有的回调中。因此,由于您正在处理HTTP请求,如果出现DB错误,客户端将不会收到响应,最终会超时。

我建议您使用catch,因为如果存在DB错误,可以使用类似于res.status(500).send(error);的内容向客户端发送正确的错误消息。

票数 1
EN

Stack Overflow用户

发布于 2018-06-17 04:12:42

我应该在这个承诺代码中有一个陷阱吗?

是的,你应该这样做。如果您的数据库调用拒绝它的承诺,那么您将永远不会响应http请求,该请求只会在没有发送响应的情况下被发送,最终会超时。除了未能及时向客户端发送响应外,这还会在超时期间消耗服务器资源。如果有一些临时数据库故障,这可能会导致大量请求堆积,直到超时,这可能耗尽服务器上的资源。

相反,您需要捕获错误并立即向http请求返回错误响应。

代码语言:javascript
复制
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调用永远不会出现错误是不安全的。健壮的编程预计在某些情况下可能会出现错误(磁盘错误、数据库磁盘卷脱机、连接池问题、查询错误等)。并适当地处理该错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50892112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档