删除云代码中的指针属性
Delete pointer property in cloud code
从 class "MyModel" 中删除对象后,下面的代码试图通过指针属性删除与其相关的两个对象,一个称为 "colors" ,另一个称为 "goal"。这些对象存在于数据中,但日志显示 "object not found" 错误。
代码来自 。
云代码:
function deleteMyModelPointer(myModel, pointerName, pointerClass) {
var pointer = myModel.get(pointerName);
if (pointer) {
var query = new Parse.Query(pointerClass);
return query.get(pointer).then(function(relatedObject) {
return relatedObject.destroy();
});
} else {
return null;
}
}
Parse.Cloud.beforeDelete("MyModel", function(request, response) {
var myModel = request.object;
deleteMyModelPointer(myModel, "colors", "ColorModel").then(function() {
return deleteMyModelPointer(myModel , "goal", "Goal");
}).then(function() {
response.success();
}, function(error) {
response.error(error);
});
});
日志:
v14 before_delete triggered for MyModel for user wMgAGMOPNK:
Input: {"object":{"ACL":{"wMgAGMOPNK":{"read":true,"write":true}},"colors":{"__type":"Pointer","className":"ColorModel","objectId":"Z3gEplJ0tq"},"counter":1,"createdAt":"2015-12-10T14:06:19.630Z","createdAtLocally":{"__type":"Date","iso":"2015-12-10T14:06:18.825Z"},"deletedLocally":false,"goal":{"__type":"Pointer","className":"Goal","objectId":"BkruZqhyJ7"},"lastModifiedAt":{"__type":"Date","iso":"2015-12-10T14:06:24.270Z"},"objectId":"LuobH2P8iz","resetValue":0,"stepBy":1,"title":"Ggggggg","updatedAt":"2015-12-10T14:06:24.670Z","user":{"__type":"Pointer","className":"_User","objectId":"wMgAGMOPNK"}}}
Result: {"code":101,"message":"Object not found."}
但是来自对象浏览器和客户端的两个指针仍然存在。正如我所说,ACL 设置为所有 3 个对象的登录 PFUser(具有读、写权限)。
问题是 OP 代码是为 objectId 属性 编写的,而不是指针。有了 objectId,正确的操作是 query.get()
来获取相关对象,但是对于指针,只需要 fetch
指针(不需要知道它的 class).
function deleteMyModelPointer(myModel, pointerName) {
var pointer = myModel.get(pointerName);
if (pointer) {
return pointer.fetch().then(function(relatedObject) {
return relatedObject.destroy();
});
} else {
return null;
}
}
调用方可以保持不变,只是去掉第三个参数。
从 class "MyModel" 中删除对象后,下面的代码试图通过指针属性删除与其相关的两个对象,一个称为 "colors" ,另一个称为 "goal"。这些对象存在于数据中,但日志显示 "object not found" 错误。
代码来自
云代码:
function deleteMyModelPointer(myModel, pointerName, pointerClass) {
var pointer = myModel.get(pointerName);
if (pointer) {
var query = new Parse.Query(pointerClass);
return query.get(pointer).then(function(relatedObject) {
return relatedObject.destroy();
});
} else {
return null;
}
}
Parse.Cloud.beforeDelete("MyModel", function(request, response) {
var myModel = request.object;
deleteMyModelPointer(myModel, "colors", "ColorModel").then(function() {
return deleteMyModelPointer(myModel , "goal", "Goal");
}).then(function() {
response.success();
}, function(error) {
response.error(error);
});
});
日志:
v14 before_delete triggered for MyModel for user wMgAGMOPNK:
Input: {"object":{"ACL":{"wMgAGMOPNK":{"read":true,"write":true}},"colors":{"__type":"Pointer","className":"ColorModel","objectId":"Z3gEplJ0tq"},"counter":1,"createdAt":"2015-12-10T14:06:19.630Z","createdAtLocally":{"__type":"Date","iso":"2015-12-10T14:06:18.825Z"},"deletedLocally":false,"goal":{"__type":"Pointer","className":"Goal","objectId":"BkruZqhyJ7"},"lastModifiedAt":{"__type":"Date","iso":"2015-12-10T14:06:24.270Z"},"objectId":"LuobH2P8iz","resetValue":0,"stepBy":1,"title":"Ggggggg","updatedAt":"2015-12-10T14:06:24.670Z","user":{"__type":"Pointer","className":"_User","objectId":"wMgAGMOPNK"}}}
Result: {"code":101,"message":"Object not found."}
但是来自对象浏览器和客户端的两个指针仍然存在。正如我所说,ACL 设置为所有 3 个对象的登录 PFUser(具有读、写权限)。
问题是 OP 代码是为 objectId 属性 编写的,而不是指针。有了 objectId,正确的操作是 query.get()
来获取相关对象,但是对于指针,只需要 fetch
指针(不需要知道它的 class).
function deleteMyModelPointer(myModel, pointerName) {
var pointer = myModel.get(pointerName);
if (pointer) {
return pointer.fetch().then(function(relatedObject) {
return relatedObject.destroy();
});
} else {
return null;
}
}
调用方可以保持不变,只是去掉第三个参数。