【发布时间】:2015-03-23 21:46:19
【问题描述】:
我在 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);
}
);
},
【问题讨论】:
-
顺便说一句,Waterline 支持承诺。这将大大提高代码的清晰度。
标签: mysql node.js asynchronous sails.js