解析服务器[Cloud Code]:处理并发请求

时间:2017-07-03 07:19:02

标签: javascript node.js parse-platform parse-server cloud-code

我们假设我在解析服务器上有一些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触发器中正确处理并发请求?

2 个答案:

答案 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 jobsbeforeSaveafterSave回调

来实现这一目标