【问题标题】:beforeSave causes Queries to return nothingbeforeSave 导致查询不返回任何内容
【发布时间】:2015-03-09 22:06:12
【问题描述】:

我有一个云函数,它接收请求并创建对象并将它们关联到一系列承诺中。如果没有 beforeSave,此功能可以正常工作,但 beforeSave 的存在是为了防止在电子邮件类中重复输入电子邮件地址。

请求

{
   "projectDescription": "Testing saveProject",
   "projectTitle": "This is only a test, in the event of a real post          this will have an actual description",
   "isEmailEnabled": true,
   "shareEmails": [
     "test1@gmail.com",
     "test2@gmail.com",
     "test3@gmail.com"
   ],
 "userId": "1234"
}

功能

Parse.Cloud.define("saveProject", function(request, response) {

    var emails = request.params.shareEmails;
    var user = request.params.userId;
    var projectDescription = request.params.projectDescription;
    var projectTitle = request.params.projectTitle;
    var emailStatus = request.params.isEmailEnabled;

    var ProjectClass = Parse.Object.extend("Project");

    var EmailsClass = Parse.Object.extend("Email");

    var EmailsClassAssignment = Parse.Object.extend("EmailAssignment");

    var project = new ProjectClass();

    var projectO;

    var emailQueryArray;

    project.set("title", projectTitle);
    project.set("createdBy", {
        "__type": "Pointer",
        "className": "_User",
        "objectId": user
    });
    project.set("description", projectDescription);
    project.set("status", true);
    project.set("emailShareEnabled", emailStatus);
    project.save().then(function(projectObject) {

        projectO = projectObject;
    }).then(function() {
        emails.forEach(function(emailAddress) {
            var email = new EmailsClass();

            email.set("address", emailAddress);
            email.save();
        });
    }).then(function() {

        emails.forEach(function(emailQuery) {
            var queryEmail = new Parse.Query("Email");

            queryEmail.equalTo("address", emailQuery);
            queryEmail.find().then(function(results) {
                emailObject = results;
                console.log(emailObject);
            });
        });
    });
});

保存代码之前

Parse.Cloud.beforeSave("Email", function(request, response) {

var query = new Parse.Query("Email");


// Gets the email key value (string) before object is saved
query.equalTo("address", request.object.get("address"));

// Checks to see if an object for that email already exists
query.first({

  success: function(object) {
    if (object) {
        response.error("This email already exisits");
    } else {
      response.success();
    }
  },
  error: function(error) {
    response.error("Could not determine if this email exists");
  }
});
});

有没有办法解决回调中的 beforeSave 保存电子邮件对象,以便我确保该对象可以查询?

我需要这些对象在那里,以便我可以获取每个对象的 Id 并在电子邮件分配类中创建一个指针。

很乐意进一步解释整个代码或函数的任何部分。

【问题讨论】:

  • 我的另一个问题是,是否值得在云函数中检查重复项而不是使用 beforeSave 以控制顺序并在我查询其 ID 之前允许该对象存在.这是否存在任何性能问题,是否仍可扩展?
  • 我没有看到任何beforeSave 或重复检查您的代码。我只是不明白吗?
  • @JLRishe 我在云端功能下添加了 beforeSave 代码

标签: javascript parse-platform promise parse-cloud-code


【解决方案1】:

savefind 一样,是一个异步方法。要等到它们完成并注意它们是否失败,您需要在循环中创建的所有 Promise 上使用Promise.when。请参阅Parse JavaScript Promises within Loop not Completing 和类似问题。

您的代码应如下所示:

var ProjectClass = Parse.Object.extend("Project");
var EmailsClass = Parse.Object.extend("Email");
var EmailsClassAssignment = Parse.Object.extend("EmailAssignment");

Parse.Cloud.define("saveProject", function(request, response) {
    var emails = request.params.shareEmails;
    var user = request.params.userId;
    var projectDescription = request.params.projectDescription;
    var projectTitle = request.params.projectTitle;
    var emailStatus = request.params.isEmailEnabled;

    var project = new ProjectClass();
    project.set("title", projectTitle);
    project.set("createdBy", {
        "__type": "Pointer",
        "className": "_User",
        "objectId": user
    });
    project.set("description", projectDescription);
    project.set("status", true);
    project.set("emailShareEnabled", emailStatus);
    project.save().then(function() {
        return Parse.Promise.when(emails.map(function(emailAddress) {
//      ^^^^^^ ^^^^^^^^^^^^^^^^^^        ^^^
            var email = new EmailsClass();
            email.set("address", emailAddress);
            return email.save();
//          ^^^^^^
        }));
    }).then(function() {
        return Parse.Promise.when(emails.map(function(emailQuery) {
//      ^^^^^^ ^^^^^^^^^^^^^^^^^^        ^^^
            var queryEmail = new Parse.Query("Email");
            queryEmail.equalTo("address", emailQuery);
            return queryEmail.find().then(function(results) {
//          ^^^^^^
                console.log(results);
            });
        }));
    });
});

【讨论】:

  • 谢谢!我对使用 Promise 和 Parse 不熟悉,所以这对这两门学科来说都是很棒的一课!
猜你喜欢
  • 2019-12-28
  • 2012-04-14
  • 1970-01-01
  • 2021-04-24
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多