我使用带有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);
}
);
},
答案 0 :(得分:1)
我的方法是,我将使fourSquareId成为唯一键,然后第二个插入无法插入重复记录。
您可以在插入时添加一个检查,一旦出现错误,会在一秒左右后再次尝试,如果再次失败,则抛出异常。