我们假设我在解析服务器上有一些Cloud Code:
Parse.Cloud.beforeSave("UserProfiles", function(request, response) {
const query = new Parse.Query("UserProfiles");
query.equalTo("user", request.user);
query.count({
success: function(count) {
if(count == 0)
response.success();
else
response.error("only one profile is allowed");
},
error: function(error) {
response.error(error.message);
}
});
});
除非发生并发,否则它可以正常工作。如果两个或多个请求同时执行新类的创建,则此代码不会检查指针字段用户下的配置文件是否已存在。
我的问题是如何在beforeSave触发器中正确处理并发请求?
答案 0 :(得分:0)
您可以首先确保您的UserProfile集合在数据库中具有用户索引。您必须根据数据库提供程序自己弄清楚如何执行此操作。这将加快您的查询速度。
否则,你在这里没有很多选择。我想说最好的办法是将创建UserProfile对象的代码放在Parse.User的beforeSave触发器中,在检查.isNew()的块中,这样只有在创建新用户时才会创建它。我能想到的任何其他解决方案都会遇到类似的并发问题。
答案 1 :(得分:0)
如果您想使用BeforeSave()
,可以在保存之前设置指向用户对象的UserProfiles
指针:
Parse.Cloud.beforeSave(Parse.User, function(request, respone){
// only apply to new users
if(request.object.isNew()){
var UserProfile = new Parse.Object.extend("UserProfiles");
var userProfile = new UserProfile();
return userProfile.save().then(function(savedUserProfile){
request.object.set("key", savedUserProfile);
return request.object.save();
});
}
});
您可以通过Cloud jobs
,beforeSave
或afterSave
回调