Sails 和 MySQL 正在创建重复的行

Sails and MySQL are creating duplicate rows

我将 sails 与 mysql 结合使用,我的异步流程出现问题,导致在我的数据库中创建了重复的行。

我有一个一对多的关系,在这个关系中一家餐馆可以有很多评论。在我的评论创建操作中,我首先查看数据库以查看与新评论相关联的餐厅是否已经存在。如果它存在,我获取现有 ID,否则我为餐厅创建一个条目,然后使用新 ID 作为外键将评论与新餐厅相关联。

问题是针对数据库中不存在的同一家餐厅同时提交了多条评论。每个评论创建都会在餐厅的数据库中查找,它不会存在。因此,每创建一个都会为餐厅创建一个条目。因此,同一家餐厅将存在重复条目。

我不确定防止此问题的最佳方法是什么。有人有建议吗?这将不胜感激。谢谢

这是我的代码:

create: function(req, res) {
//probably put this in a helper
var validAttributes = ["content", "foursquareId", "author"];
validAttributes.unshift(req.body);
var reviewParams = _.pick.apply(null, validAttributes);

async
.waterfall(
  [
    function(callback) {

      Venue
      .findOneByFoursquareId(reviewParams.foursquareId)
      .exec(function(err, existingVenue) {

        debugger;

        if (err) {
          console.log("Error: " + err);
          return res.send(500, "Error finding venue: " + err);
        }

        if (! existingVenue) {

          // The Venue Exists in the Database

          sails.venuesHelper
          .create(reviewParams.foursquareId, function(err, newVenue) {

            if (err) {
              console.log("Error creating venue: " + err);
              return res.send(500, "Error creating venue: " + err);
            }

            console.log('created : ', newVenue);
            reviewParams.venue = newVenue.id;

            callback(null);

          });

        }
        else {

          console.log('existed : ', existingVenue);

          reviewParams.venue = existingVenue.id;

          callback(null);

        }

      });

    },

    function(callback) {

      // The venue exists in the database.

      review.create(reviewParams)
      .exec(function(err, review) {

        if (err) {
          console.log("Error: " + err);
          return res.send(500, "review could not be saved: " + err);
        }

        console.log(review);

        callback(null, review);

      });

    },

  ],
  function(err, results) {

    return res.json(results);

  }
);

},

我的做法是将fourSquareId设为唯一键,这样第二次插入就无法插入重复记录了。

您可以在插入上添加一个检查,一旦出错,大约一秒后再次尝试,如果再次失败,则抛出异常。