【问题标题】:Return empty array or error返回空数组或错误
【发布时间】:2014-09-11 05:33:26
【问题描述】:

我让 nodejs 访问数据库以检索一行订单。 以下函数定义在一个名为 orderDb.js 的文件中

module.exports.getWaitingOrders = function getWaitingOrders(callback) {
    pool.query("SELECT * FROM live_order_table WHERE isWaiting = 1;", function(err, rows, fields) {
        if (err) {
            return new Error('Db error: ' + err);
        }
        if (rows.length <= 0) {
            return new Error("No results"); //Is this recommended?
            return [];// or this?
        }

        rows.forEach(function(row) {
            var order = {
                orderID: row.order_id
            }
        });
    }
}

当数据库没有返回任何内容时,我应该返回错误还是空数组/对象?

我这样调用方法:

orderDb.getWaitingOrders(function handleWaitingOrders(err, orders){});

我还有一个关于如何处理数据库问题的问题。我现在正在做的是记录错误并稍后重试。我应该遵循更好的做法吗?

【问题讨论】:

  • 这取决于您想要返回什么,以及您期望返回什么。您可以抛出错误、返回 false、null、未定义、空数组、独角兽或阳光,这并不重要,只要它是您在事物的另一端所期望的。
  • 我同意@adeneo。但我的观点是,如果这是问题的根源,你应该只抛出错误。错误和空列表在语义上是不同的,应该在各自的地方使用。如果您搜索某些内容并找到 0 个项目,我觉得那应该是一个空列表,因为您专门描述了找到 0 个项目。但是,如果有数据库问题、IO 问题、任何方式的异常,你都应该传播它。只是我的意见
  • 老实说,这取决于“另一端”的含义。前端?如果您只是获取订单并列出它们,那么这取决于您想要在视觉上做什么。也许您会显示一条消息说“没有等待订单”,否则列出订单。同时,如果你得到一个错误,你会显示它(或者在不同的地方,比如一个模态)。我想将错误与空数据混合在一起对我来说感觉很奇怪,因为它们是两个完全不同的东西,并且意味着不同的东西。显然,您可以将它们混合使用,但它可能会更难维护
  • @Ian +1 这取决于你如何处理另一端的事情
  • @VivekBajpai 没错,我只是想我会对此发表意见:)

标签: javascript node.js error-handling asynccallback


【解决方案1】:

您应该返回一个空数组或 null,以便您可以识别数据库的错误

module.exports.getWaitingOrders = function getWaitingOrders(callback) {
    pool.query("SELECT * FROM live_order_table WHERE isWaiting = 1;", function(err, rows, fields) {
        if (err) {
            return new Error('Db error: ' + err) ;
        }
        if (rows.length <= 0) {
            callback(err , []); // you should return an empty response here so that you can differentiate between error and no order

        }

        rows.forEach(function(row) {
            var order = {
                orderID: row.order_id
            }
        });
    }
}


orderDb.getWaitingOrders(function handleWaitingOrders(err, orders){

// do your error handling here 

});

【讨论】:

  • @ian 在上面的 cmets 中建议的相同。抱歉,我没有足够的代表来支持您的答案。
  • @sfabriece 是的,他完全正确,这取决于你如何处理另一端的事情。但如果没有订单返回数据库,你应该始终清楚区分错误
猜你喜欢
  • 2022-12-09
  • 2023-01-20
  • 1970-01-01
  • 2016-07-31
  • 2016-12-24
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多