简体   繁体   English

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

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

Let's say I have some Cloud Code on Parse Server: 假设我在解析服务器上有一些云代码:

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);
            }
    });
});

It works fine unless concurrency happen. 除非并发发生,否则它工作正常。 If two or more requests at the same time execute creation of new classes then this code wouldn't check that profile under pointer field user already exist. 如果两个或多个请求同时执行新类的创建,则此代码将不会检查指针字段用户下的配置文件是否已存在。

My question is how properly handle concurrent requests in beforeSave trigger? 我的问题是如何在beforeSave触发器中正确处理并发请求?

You can start by ensuring your UserProfile collection has an index by user in your database. 您可以首先确保您的UserProfile集合在数据库中具有按用户索引。 You'll have to figure out how to do this yourself based on your database provider. 您必须根据数据库提供者自己弄清楚该如何做。 This will speed up your queries. 这样可以加快查询速度。

Otherwise, you don't have a lot of options here. 否则,您在这里没有太多选择。 I'd say the best bet is to put the code that creates the UserProfile object inside the beforeSave trigger for Parse.User, inside a block that checks for .isNew(), so it only gets created when a new user is created. 我想说最好的选择是将创建UserProfile对象的代码放在Parse.User的beforeSave触发器内,并放在检查.isNew()的块内,以便仅在创建新用户时创建它。 Any other solution I can think of would have similar concurrency issues. 我能想到的任何其他解决方案都会有类似的并发问题。

If you want to use BeforeSave() you can set the the UserProfiles pointer to the user object before saving like so: 如果要使用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();
        });
      }
});

you can achive that by either Cloud jobs , beforeSave or afterSave callbacks 您可以通过Cloud jobsbeforeSaveafterSave回调来实现

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

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