解析iOS SDK:理解云代码

9

背景 = 我正在逐渐理解Parse的云代码功能,但我需要一些帮助,想请那些愿意回答一些关于示例云代码函数中发生了什么的简短、相对简单的问题的人提供帮助。

以下是我在本例中使用的代码:

1)云代码

Parse.Cloud.define('editUser', function(request, response) {

    var userId = request.params.userId,
    newColText = request.params.newColText;

    var User = Parse.Object.extend('_User'),
    user = new User({ objectId: userId });

    user.set('new_col', newColText);

    Parse.Cloud.useMasterKey();
    user.save().then(function(user) {
        response.success(user);
    }, function(error) {
        response.error(error)
    });

});

2) iOS调用

[PFCloud callFunction:@"editUser" withParameters:@{

    @"userId": @"someuseridhere",
    @"newColText": @"new text!"

}];

这段代码来自这里

问题1=

(request, response) 

我对这是什么感到困惑。这是否类似于iOS中的类型转换,我在iOS调用中说我要将NSString传递到这个函数中("userId"),在云代码函数内部我会将其称为"request"? 这就是正在发生的事情吗? 问题2 =
Parse.Object.extend('_User') 

这是从 Parse 数据库获取“User”类,以便在下面的行中创建新的“user”,从而更新它的“PFObject”吗?
这就像一个...
PFObject *userObject = [PFObject objectWithClassName:@"User"]?

Question 3 =

user.set('new_col', newColText)

这显然是将值“设置”为要保存到PFUser(~我想)的值。我知道“newColText”变量是要设置的文本,但“new_col”是什么?我唯一能想到的就是这将在通过“request”传递的任何类型的数据库中设置一个新列的名称。 这类似于...
[[PFUser currentUser] setObject: forKey:]

Question 4 =

Parse.Cloud.useMasterKey() 

不用过于技术性地讲解,这基本上是我在编辑另一个用户的“用户”对象之前需要输入的全部内容吗?

问题5 =

user.save().then(function(user) {
        response.success(user);
    }

这是一种类似于...的技术吗?
[user saveInBackgroundWithBlock:]? 

如果是这样,那么,
function(error) {
        response.error(error)

只是设置当saveInBackgroundWithBlock出现错误时会发生什么?

请记住,我了解iOS - 不是JavaScript。因此,请尽可能详细地描述给那些了解苹果领域的人。


这是一个非常好的问题。尝试查找一些backbone.js教程,这就是很多云代码工作的方式。 - Nick H
2个回答

11

以下是我对您问题的看法:

  1. request参数是让您访问云函数请求/调用中的所有内容,包括传递的参数(request.params)、在客户端上已验证的用户(request.user)以及其他一些您可以在文档中了解到的内容。 response是让您向调用代码发送信息的,通常使用response.success()response.error(),其中包含在响应中的可选字符串/对象等,再次参考文档
  2. 这是创建User实例的一种方法,由于它是一个特殊的内部类,因此名称为_User,同样适用于_Role_Installation。 它正在使用ID创建用户实例,而不是创建新用户(新用户在保存之前没有ID)。 通过这种方式创建对象,您可以仅更改要更新的属性即可“修补”它。
  3. 再次查看文档示例,第一个参数是列名(如果不存在,则将创建),第二个值是您要将该列设置为的值。
  4. 当您需要执行客户端登录的用户没有权限执行的操作时,您必须执行Parse.Cloud.useMasterKey()。 它的意思是“忽略所有安全性,我知道自己在做什么”。
  5. 您正在看到一个Promise链,链中的每个步骤都允许您传入一个“成功”处理程序和一个可选的“错误”处理程序。有一些很好的文档。 当您想按顺序执行一些任务时,它非常方便,例如:

示例代码:

var post = new Parse.Object('Post');
var comment = new Parse.Object('Comment');
// assume we set a bunch of properties on the post and comment here
post.save().then(function() {
    // we know the post is saved, so now we can reference it from our comment
    comment.set('post', post);
    // return the comment save promise, so we can keep chaining
    return comment.save();
}).then(function() {
    // success!
    response.success();
}, function(error) {
    // uh oh!
    // this catches errors anywhere in the chain
    response.error(error);
});

这是一个很好的答案。我想补充一下第二点,使用Parse.Object.extend()可以扩展_User对象,但最好使用Parse.User()类本身。 - Troy Sandal
感谢您的回答@Timothy Walters!我知道这有点晚了,但我一直很忙。我有几个关于行user = new User({ objectId: userId });的跟进问题:1)“new”部分。这是创建一个“全新”的用户,还是获取现有的objectId:userID用户并更新它? 2)如果后者是真的,那么我可以在“userID”列而不是“objectId”列中获取用户吗?像这样... user = new User({ userID: userId }); - Tom Testicool
关于4) Parse.Cloud.useMasterKey(); 已经在Parse Server版本2.3.0(2016年12月7日)中被弃用。从那个版本开始,它是一个无操作(什么也不做)。现在,您应该在需要覆盖ACL或CLP的每个方法中插入{useMasterKey:true}可选参数到您的代码中。 - alvaro

3

我和你基本上处于同一位置,不过以下是我的想法:

  1. 不是的,这些参数是函数接收到的。当某个东西调用editUser云函数时,你将拥有这两个对象可供使用:请求(request)和响应(response)。请求基本上是iOS设备发送到服务器的内容,而响应则是服务器将要发送给iOS设备的内容。
  2. 并不完全是那样。它就像是创建_User的子类。
  3. 将Parse对象类型视为数据库表,其实例作为行来考虑。 set会将'newColText'的值设置为属性/列'new_col'的值。
  4. 不确定,因为我从未使用过该函数,我不处理用户对象。但可能是这样的。
  5. 大致上就是这样。不过更像是这样的(伪代码,混合JS和Obj-C):

[user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error){ if(error){ response.error(error); // 标记函数为失败,并将错误对象返回给iOS设备 } else{ response.success(user); // 标记函数调用成功,并将用户对象返回给iOS设备 } }];


你的回答对我帮助很大,比 Parse Cloud Code 的整个文档都要好。但是问题2和问题4对我来说还有点棘手。因此,我现在将保留这个问题未回答,但同时我会给你的回答点赞。如果在那之前我解决了这个问题,我会将你的回答标记为正确的。 - Tom Testicool
好的 :) 但是关于问题2:你可能需要extend("_User"),因为你已经添加了至少一个属性到默认的_User类中。如果你实例化一个_User对象,它将不会有这些新属性(例如'new_col'),然后你就无法在该对象上进行set('new_col', new_col_value)操作。再次说明,我不是Cloud Code的专家,但这是我从文档中理解的。祝玩得愉快! - B.R.W.
我自己并不是云代码专家。但是告诉我这个问题,因为这会解决很多问题。在第二个问题中,Parse.Object.extend('_User') - 你是说我想要编辑哪个类 - 然后你 user = new User({ objectId: userId }); 创建了类似“PFObject”的东西,以便设置新数据,然后保存对象。从未创建过新对象,只是更新了现有对象。这正确吗? - Tom Testicool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接