Sails和MySQL正在创建重复的行

时间:2015-03-22 18:15:10

标签: mysql node.js asynchronous sails.js

我使用带有mysql的sails并且我的异步流程出现问题导致在我的数据库中创建了重复的行。

我有一对多的关系,餐馆可以有很多评论。在我的评论创建操作中,我首先查看数据库,以查看新评论将与之关联的餐厅是否已存在。如果它存在,我抓住现有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);

  }
);

},

1 个答案:

答案 0 :(得分:1)

我的方法是,我将使fourSquareId成为唯一键,然后第二个插入无法插入重复记录。

您可以在插入时添加一个检查,一旦出现错误,会在一秒左右后再次尝试,如果再次失败,则抛出异常。