使用数据库/水线错误处理Sailsjs错误

时间:2017-04-17 13:59:12

标签: mysql node.js sails.js waterline

我正在构建一个接收webhook数据的api(来自shopify的命令)并将它们保存到关系mysql数据库中。每个订单中都有属于集合(类别)的产品。我将产品与集合相关联,或者创建一个尚未存在的新集合。我遇到的问题是,因为我不能使用findOrCreate()我首先执行find(),然后如果找不到任何内容我会创建一个。但是,由于nodejs是异步的,如果我同时收到许多订单,有时同时找不到两个不同产品的同一个集合,然后一个会在另一个尝试之前创建它,所以当另一个试图创建它的水线投掷错误:

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

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

if (err){ findmethodagain(); }

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

1 个答案:

答案 0 :(得分:0)

如果你没有看到这么多,那么在延迟之后再做第二次尝试就不会有什么坏处。例如,Bluebird可以使用Promise.delay在任何错误上运行一些毫秒后运行第二个函数。如果在大多数情况下其中一个创建了集合,那么只需重试一次即可成功。

如果你看到很多其他错误,那就修好它们。

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