繁体   English   中英

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

[英]Parse Server [Cloud Code]: Handle concurrent requests

假设我在解析服务器上有一些云代码:

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触发器中正确处理并发请求?

您可以首先确保您的UserProfile集合在数据库中具有按用户索引。 您必须根据数据库提供者自己弄清楚该如何做。 这样可以加快查询速度。

否则,您在这里没有太多选择。 我想说最好的选择是将创建UserProfile对象的代码放在Parse.User的beforeSave触发器内,并放在检查.isNew()的块内,以便仅在创建新用户时创建它。 我能想到的任何其他解决方案都会有类似的并发问题。

如果要使用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回调来实现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM