Parse Cloud 函数失败并出现错误 141

Posted

技术标签:

【中文标题】Parse Cloud 函数失败并出现错误 141【英文标题】:Parse Cloud function fails with error 141 【发布时间】:2014-07-13 13:50:57 【问题描述】:

我想要完成的是,当我调用这个云函数 (deploy) 时,它会首先删除 toClass 中的所有数据,然后遍历 fromClass 中的对象,将它们复制并保存到 @987654324 @。当它保存一个对象时,它也会从fromClass 中删除它。简而言之,将对象从类移动到另一个。在客户端调用这个函数

[PFCloud callFunctionInBackground:@"deploy" withParameters:@@"toClass": kTilrClassUpdates, @"fromClass": kTilrClassPrototypeUpdates block:^(id object, NSError *error) 
    if (error) 
        [self failed];
     else 
        [self succeeded];
    
];

会将此错误信息打印到客户端日志:Error: undefined (Code: 141, Version: 1.2.19)

这是 Parse Cloud 的代码:

Parse.Cloud.define("deploy", function(request, response) 
    var query = new Parse.Query(request.params.toClass);
    query.find(
        success: function(results) 
            for (var i = 0; i < results.length; ++i) 
                console.log(results[i]);
                results[i].destroy(
                    success: function(object) 

                    ,
                    error: function(object, error) 
                        response.error(error);
                    
                );
            
        ,
        error: function() 
            response.error(error);
        
    );
    var query2 = new Parse.Query(request.params.fromClass);
    query2.find(
        success: function(results) 
            for (var index = 0; index < results.length; ++index) 
                var UpdateInfoClass = Parse.Object.extend(request.params.toClass);
                var updateInfo = new UpdateInfoClass();
                for (var k in results[index]) 
                    updateInfo.set(k, results[index][k]);
                
                console.log(updateInfo);
                updateInfo.save(null, 
                    success: function(updateInfo) 
                        results[index].destroy();
                        if (index == results.length - 1) 
                            response.success();
                        
                    ,
                    error: function(updateInfo, error) 
                        response.error(error);
                    
                );
            
        ,
        error: function() 
            response.error(error);
        
    );
);

我真的不太了解 javascript,所以这可能是一个非常简单的错误。

【问题讨论】:

【参考方案1】:

有几个部分可以保证为您解决问题: 在不质疑您的设计的同时:

1) 查询不会链接在一起,而是会同时运行

2) 你不能使用

for (var k in results[index]) 
    updateInfo.set(k, results[index][k]);

将属性从一个对象复制到另一个对象。 您需要调用JSON.stringify(results[index]) 来获取标准数组。 您应该通过 request.object.set(fiedlName, value) 之类的方式设置值。

3) “索引”不会正确传播到子块中 - 将其登录到控制台,您会看到,因为这些查询也没有链接起来,它会立即运行,因此索引将具有一些值或最后一个值因为它很快

但是,您的方法的设计是有问题的:

Database on parse 与普通的 sql 数据库有点不同,你也许应该重新设计你的方法,也许使用一个类,只是通过名称标记对象的类或更改它们的状态(已部署 = 0 / 1),很难猜到你想完成什么,但你的方式保证了一些问题。

另请注意,cloudcode 函数确实有一些超时,因此一旦您拥有更多对象,您可能无法保存所有对象。 (150个对象是乐观的看法)

您可以通过编写适当的“.beforeSave”函数来实现您的解决方案,该函数在您保存对象时触发,这样您就可以根据您的条件用新对象替换旧对象...

【讨论】:

您对一类和不同状态的建议听起来很棒。我会尝试一下,但我必须重写我的客户端逻辑,所以它不会立即完成。

以上是关于Parse Cloud 函数失败并出现错误 141的主要内容,如果未能解决你的问题,请参考以下文章

Parse Cloud Code 嵌套查询上的代码 141(错误:未调用成功/错误)

解析服务器云代码查询语法错误 141

解析云代码给我代码:141 错误

解析云代码错误:未调用成功/错误(代码:141,版本:1.9.0)

AWS EC2 上的解析服务器在云代码上给出 141 错误

解析云代码错误 - “需要主密钥”?