【问题标题】:Parse Cloud Code Defines with Parse 3.0.0Parse Cloud 代码使用 Parse 3.0.0 定义
【发布时间】:2019-03-06 18:58:14
【问题描述】:

我正在尝试使用 Parse 从云代码中的 Parse.Cloud.define 函数返回值。我正在使用 Parse 3.0.0,我可以让它从简单的云代码定义中返回值,但不是复杂的。

我正在用 Objective-C 编写客户端 iOS。

这里是云代码功能(不安全我不管,我不改)

Parse.Cloud.define("doStuff", (request) => {
    const query = new Parse.Query(Parse.User);
    query.equalTo("username", request.params.username);
    query.first({useMasterKey:true})
    .then((results) => {
        Parse.User.requestPasswordReset(results.get("email"))
        .then(() => {
            return "good work";
        }).catch((error) => {
        });
    })
    .catch((error) =>  {
    });
});

这很好用,它使用用户的用户名字段按预期将电子邮件发送给用户。

在 iOS 中我这样称呼它:

[PFCloud callFunctionInBackground:@"doStuff" withParameters:@{@"username" : cleanEntryData} block:^(NSString * object, NSError * error) {
 if (!error) {
NSLog(@"success %@", object);
} else {
 NSLog(@"error %@", error);
}
}];

此调用在 iOS 中有效,并且电子邮件已成功发送给用户以重置密码。然而,这就是问题所在。

当我打电话时

 NSLog(@"success %@", object);

Xcode 调试窗口中的值为

success (null)

我希望它是

success good work

当我这样定义一个简单的云代码时:

Parse.Cloud.define("testing", (req) => {
     return "very good";
});

像这样使用 iOS:

 [PFCloud callFunctionInBackground:@"testing" withParameters:@{@"nothing" : @"nothing"} block:^(NSString * object, NSError * error) {
                                    if (!error) {
                                        NSLog(@"success %@", object);

                                    } else {

                                    }
                                }];

然后我在 Xcode 调试器中得到我正在寻找的结果

success very good

我不知道为什么“doStuff”云代码定义没有返回字符串“good work”,而函数显然正在执行并按应有的方式发送电子邮件。我已经阅读了 Parse 3.0.0 和 JS 2.0.0 指南,但它们对 Parse Cloud 定义的工作方式并没有很好的描述。我不是 JS 编码员,我只在移动设备上编码,所以我可能在做一些愚蠢的事情。任何帮助都会很棒。谢谢。

【问题讨论】:

    标签: javascript objective-c parse-platform parse-cloud-code


    【解决方案1】:

    您的 iOS 代码没有问题,问题在于云代码,因此您需要更改云代码,因为它不一定不安全,而是有缺陷。

    问题是您将Promises 相互嵌套,而不是将它们链接在一起,因此单个嵌套返回值在多个嵌套层中丢失。

    Parse.Cloud.define("doStuff", (request) => {
        const query = new Parse.Query(Parse.User);
        query.equalTo("username", request.params.username);
        return query.first({useMasterKey:true})
        .then((results) => {
            return Parse.User.requestPasswordReset(results.get("email"));
        }).then(() => {
            return "good work";
        })
    });
    

    【讨论】:

    • 这样确实会发送密码重置电子邮件,但 NSLog 结果仍然是“成功(空)”。
    • @Loxx 检查我更新的答案,我刚刚意识到 define 中的闭包需要返回 Promise 本身,所以现在应该可以工作了。
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多