【问题标题】:Sailsjs error handling with database / waterline errorsSailsjs 错误处理数据库/水线错误
【发布时间】:2017-09-13 03:48:19
【问题描述】:

我正在构建一个 api,它接收 webhook 数据(来自 shopify 的订单)并将它们保存到关系 mysql 数据库中。每个订单中都有属于集合(类别)的产品。我将产品与集合相关联,或者如果它尚不存在,则创建一个新集合。我遇到的问题是,因为我不能使用findOrCreate(),所以我先做一个 find(),然后如果什么也没找到,我做一个创建。但是,由于 nodejs 是异步的,如果我同时收到很多订单,有时不会同时为两种不同的产品找到相同的集合,然后一个会在另一个尝试之前创建它,所以当另一个尝试创建它的水线会引发错误:

col_id • 带有col_id 的记录已存在(405145674)。

捕获此错误的最佳方法是什么,以便我可以再执行一次 find(),以便函数返回正确的集合而不是未定义的集合?我可以这样做:

if (err){ findmethodagain(); }

但是它会尝试任何错误,而不是“具有该 id 的记录已经存在”错误。

【问题讨论】:

  • 尝试检查错误以查找此类错误所特有的某些唯一代码或属性,并仅在此类代码匹配时重试。
  • @Sangharsh 当我 console.log 错误时,它说明了问题所在,但我不知道如何获取错误的某些部分。我应该只做一个 err.search('A record with that col_id alreasy exists') 还是 lodash 等价物?
  • 记录错误时,仅显示err.toString()。查看 err 的其他属性,这里没有显示,但在这里很有用。例如。 err.code, err.toPOJO(), err.ValidationError, err.originalError, err.invalidAttributes
  • @Sangharsh 太棒了!有没有关于那个地方的文档?我想读一读。
  • 还没有看到这方面的文档(这也意味着错误属性可能会在未来的版本中发生变化)。见github.com/balderdashy/waterline-docs/issues/…

标签: mysql node.js sails.js waterline


【解决方案1】:

如果您没有经常看到这种情况,那么在延迟后再进行第二次尝试也没有什么坏处。您可以使用 Promise.delay 来自,例如 Bluebird,在出现任何错误的几毫秒后运行第二个函数。如果在大多数情况下,其中一个创建了集合,那么您只需重试一次即可成功。

如果您发现许多其他错误,那么请修复它们。

但是,竞争条件通常表明您需要重新设计架构。我建议不要依赖错误属性或试图绕过它们,而是重新设计它,至少对于必须创建新集合的情况。一种流行的选择是设置工作队列。在您的情况下,您只需在第一遍中使用find 来查看是否存在集合,如果不存在,则将其启动到队列中,以便单个工作人员按顺序获取。在工人工作中,做你的find 然后创建。您可以使用RedisBull 快速轻松地进行设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2016-04-11
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多