解析后台作业each()不会通过所有记录?

时间:2014-10-18 00:19:36

标签: parse-platform

我编写了一个云作业,在用户对象中插入用户首字母和姓氏的小写版本,以便我可以从我的客户端应用程序执行搜索。

当我在一个有40个用户的开发解析应用程序上运行这个工作时,它运行得很好。

当我在我的制作应用程序上运行此操作但是它没有更新我的所有记录。我目前有几千个用户,我希望这个云工作能够照顾到所有这些,如下所述:

http://blog.parse.com/2013/05/13/launch-and-iterate-parse-data-migrations/

" Parse.Query对象上的每个新方法都允许您这样做。即使您在集合中有数万个或更多对象,它也会返回每个对象,让您有机会根据需要修改它们。"

那么我的问题是为什么这个函数会留下超过一半的数据库?它只适用于一大堆用户,可能只有几百个。

如何使此功能影响User表中的WHOLE DATASET?

Parse.Cloud.job("migration1", function(request, status) {
  // Set up to modify user data
  Parse.Cloud.useMasterKey();
  // Query for all users
  var query = new Parse.Query(Parse.User);
  query.each(function(user) {
      // Set and save the change
      var firstname = user.get("firstname");
      if(firstname) {
        user.set("searchfirstname", firstname.toLowerCase());   
      } else {
        user.set("searchfirstname", "");    
      }
      var lastname = user.get("lastname");
      if(lastname) {
        user.set("searchlastname", lastname.toLowerCase()); 
      } else {
        user.set("searchlastname", ""); 
      }
      return user.save();
  }).then(function() {
    // Set the job's success status
    status.success("search migration completed successfully.");
  }, function(error) {
    // Set the job's error status
    status.error("Uh oh, something went wrong with search migration");
  });
});

编辑: 好的,当我查看错误日志时,我看到了:

E2014-10-18T15:48:49.984Z] v63: Ran job searchMigration with:
  Input: {}
  Failed with: TypeError: Cannot call method 'toLowerCase' of undefined

我试图以任何我能想到的方式检查未定义但我仍然遇到同样的问题。 我试图检查undefined的是:

if(lastname === undefined  || lastname === void 0 || typeof lastname == 'undefined') ...

我仍然得到未定义错误的toLowerCase,我认为这就是为什么作业不会影响我的所有用户表,因为它停止...

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

所以,我终于弄清楚为什么这份工作没有通过所有的记录,但它会在“随机”记录后停止......

我为用户提供了一个AfterSave挂钩,它在上述作业的每次迭代中被触发... 在保存之后,它会产生错误,并使作业失败。

因此,出于某种原因,我认为在作业内部对用户进行的保存不会触发后保存挂钩。

就是这样。现在一切正常。