解析云代码保存问题

时间:2016-01-24 14:19:33

标签: parse-platform cloud-code

几年前,我为Parse.com移动应用程序编写了一些后端代码,并且刚刚被要求添加一项功能。但是,我发现经过一些小的调整后代码就不会成功。所以,我回滚到工作副本,下载,然后再部署,它也无法正常工作!我想知道这是否是Parse软件的变化?

代码在save方法失败,因为在此之前所有日志都很好。错误案例的日志显示“未提供消息”。如果我不使用message属性,它只显示'{}',所以我认为它是空的。我已经在错误案例中设置了promise解决方案,以便在我调试时停止作业超时。我从未理解的一件事是为什么我必须制作两个Seed对象并捎带一个才能正确保存。如果我做了a.save(null,...)它就行不通了。

任何帮助都会很棒。谢谢!

PS:为下面的缩进道歉 - 在我的文件中它是正确的。

function flush() {
  //Clear the previous records from the class.
  var Seed = Parse.Object.extend("Seeds");
  var _ = require("underscore");
  var arr = [];
  var query = new Parse.Query(Seed);
  return query.find().then(function(oldSeeds) {
    _.each(oldSeeds, function(oldSeed) {
      arr.push(oldSeed.destroy());
    });
    return Parse.Promise.when(arr);
  });
}

Parse.Cloud.job("fetchjson", function(request, status) {

  var url = 'someurl';

  flush().then(function() { Parse.Cloud.httpRequest({url: url}).then(function(httpResponse){
    var Seed = Parse.Object.extend("Seeds");
    var jsonobj = JSON.parse(httpResponse.text);
    var _ = require("underscore");

    var results = [];
    // do NOT iterate arrays with `for... in loops`
    _.each(jsonobj.seeds, function(s) {

        var p = new Parse.Promise();
        results.push(p); // Needs to be done here or when() will execute immediately with no promises.
        var seed = new Seed();
        var a = new Seed(s);
        var image_url = a.get("image")

        //Get the JSON.
        Parse.Cloud.httpRequest({url: image_url}).then(function(response) {
          console.log("Fetching image at URL: " + image_url);
          //Create a new image object and save, passing ref through promise.
          var file = new Parse.File('thumb.jpg', { base64: response.buffer.toString('base64', 0, response.buffer.length) });
          return file.save();
        }).then(function(thumb) {
          console.log("Attaching thumb to object");
          //Set image ref as object attribute.
          a.set("imageFile", thumb);
          console.log("Parsing views into viewsint");
          //Save decimal string as int into another attribute.
          a.set("viewsInt", parseInt(a.get("views")));
      console.log("Parsing description into descriptionarray");
          //Save string as array into another attribute.
      var dar = new Array(1);
      //dar[0] = a.get("description")
          a.set("descriptionarray", [a.get("description")]);
        }, function(error) {
          console.log("Error occurred :(");
        }).then(function(){
          console.log("Saving object");
          //Save the object and resolve the promise so we can stop.
          seed.save(a,{
            success: function(successData){
              console.log(successData);
              p.resolve(successData);
            },
            error: function(error){
              console.log(error.message);
              p.resolve(error);
            }
          });
        });
    });
    // .when waits for all promises to be resolved. This is async baby!
    Parse.Promise.when(results).then(function(data){
      console.log("All objects saved");
      status.success("Updated Succesfully");
    });
  }, function(error) {
    //Oh noes :'(
    console.error('Request failed with response code ' + httpResponse.status);
    status.error("Update Failed");
  });
});
});

2 个答案:

答案 0 :(得分:0)

我稍微改变了你的代码并提出了一些意见来解释:

// DEFINE THESE ON THE TOP. NO NEED TO REPEAT.
var _ = require("underscore");
var Seed = Parse.Object.extend("Seeds");

function flush() {
  //Clear the previous records from the class.
  var arr = [];
  var query = new Parse.Query(Seed);
  return query.find().then(function(oldSeeds) {
    _.each(oldSeeds, function(oldSeed) {
      arr.push(oldSeed.destroy());
    });
    return Parse.Promise.when(arr);
  });
}

Parse.Cloud.job("fetchjson", function(request, status) {

  var url = 'someurl';

  flush().then(function() {
    Parse.Cloud.httpRequest({url: url}).then(function(httpResponse){
      var jsonobj = JSON.parse(httpResponse.text);

      var results = [];

      _.each(jsonobj.seeds, function(s) {

        // ONE SEED OBJECT WITH INITIAL SET OF DATA FROM JSON
        var seed = new Seed(s);

        var image_url = seed.get("image")

        // A SERIAL PROMISE FOR EACH SEED
        var promise = Parse.Cloud.httpRequest({url: image_url}).then(function(response) {
          console.log("Fetching image at URL: " + image_url);
          //Create a new image object and save, passing ref through promise.
          var file = new Parse.File('thumb.jpg', { base64: response.buffer.toString('base64', 0, response.buffer.length) });
          return file.save();
        }).then(function(thumb) {
          // SETTING MORE PROPERTIES
          //Set image ref as object attribute.
          console.log("Attaching thumb to object");
          seed.set("imageFile", thumb);

          //Save decimal string as int into another attribute.
          console.log("Parsing views into viewsint");
          seed.set("viewsInt", parseInt(seed.get("views")));

          //Save string as array into another attribute.
          console.log("Parsing description into descriptionarray");
          seed.set("descriptionarray", [seed.get("description")]);

          // SAVING THE OBJECT
          console.log("Saving object");
          return seed.save();
        });

        // PUSH THIS PROMISE TO THE ARRAY TO PERFORM IN PARALLEL
        results.push(promise);
      });

      Parse.Promise.when(results).then(function(data){
        console.log("All objects saved");
        status.success("Updated Succesfully");
      });
    }, function(error) {
      console.error('Request failed with response code ' + httpResponse.status);
      status.error("Update Failed");
    });
});
});

答案 1 :(得分:0)

谢谢knshn。自那个版本以来我已经重构了很多代码(包括你做的几个修改),但我发布的版本与以前工作正常的版本相同。您的更改让我看到了正确的错误。出于某种原因,简单的单个对象实现最初并不适用于我,因此这是一个讨厌的解决方法。它虽然现在有效。

我现在找到了罪魁祸首 - Seed类有一个名为' id'的属性。使用旧版本,这工作正常,但是当我部署该代码时,它给出了错误101:'找不到更新的对象'。这必须是因为新的Parse代码将内部objectId混合在一起,并且混淆了id与预期的不同。我想知道如何仍然可以使用回滚。也许at版本被标记为使用旧的Parse代码。

我的解决方法是为ID使用不同的名称 - ' seed_id'。