解析 beforeSave() 云代码功能不起作用
Parse beforeSave() cloud code function not working
我添加了一个 beforeSave() Parse 定义的云函数,但它无法正常工作。
这是背景:
我有一个名为 UserRewards 的 class,它有一个名为 user 的列,类型为 ParseRelation。它由 1 个关系组成,该关系具有 ParseUser 类型的单个对象。我有一个新列 pUser 我想在此函数中设置。它查找 user 关系,在其中找到 ParseUser,并将 pUser 设置为该用户。
这是我的代码
Parse.Cloud.beforeSave("UserRewards", function(request, response) {
var relation = request.object.relation("user");
relation.query().find({
success: function(list) {
console.log("looked up relation");
if (list.length > 0) {
var pUser = list[0];
request.object.set("pUser", pUser);
console.log("updated pUser");
}
},
error: function(error) {
console.error("unable to lookup relation");
}
});
response.success();
});
当我更新 UserRewards 行时,将调用此函数。但它什么都不做——没有任何控制台或错误日志。
有什么想法吗?
您的函数在查询完成之前运行 response.success(),从而取消它。尝试...
Parse.Cloud.beforeSave("UserRewards", function(request, response) {
var relation = request.object.relation("user");
relation.query().find({
success: function(list) {
console.log("looked up relation");
if (list.length > 0) {
var pUser = list[0];
request.object.set("pUser", pUser);
console.log("updated pUser");
}
response.success();
},
error: function(error) {
console.error("unable to lookup relation");
response.error(error);
}
});
});
或者,用 promises 更容易看...
Parse.Cloud.beforeSave("UserRewards", function(request, response) {
var relation = request.object.relation("user");
relation.query().find().then(function(list) {
console.log("looked up relation");
if (list.length > 0) {
var pUser = list[0];
request.object.set("pUser", pUser);
console.log("updated pUser");
}
response.success();
}, function(error) {
console.error("unable to lookup relation");
response.error(error);
});
});
EDIT 我想我理解后续问题是要求将指针属性与关系属性同步,假设在保存之前只设置了其中一个。这可以通过检测关系是否为空来完成。如果是,再执行一个异步步骤来获取指针...
Parse.Cloud.beforeSave("UserRewards", function(request, response) {
var relation = request.object.relation("user");
relation.query().find().then(function(list) {
console.log("looked up relation");
if (list.length > 0) {
var pUser = list[0];
request.object.set("pUser", pUser);
console.log("updated pUser");
return Parse.Promise.as(); // we're done, this will pass nothing to the next step
} else { // the relation is empty, so the user pointer must be set
var pointer = request.object.get("pUser");
return pointer.fetch(); // this will pass the pUser to the next step
}
}).then(function(pUser) {
if (pUser) {
// must have found an empty relation in the last step. add the user pointer to it
request.object.relation.add(pUser);
}
response.success();
}, function(error) {
console.error("unable to lookup relation");
response.error(error);
});
});
(注意代码未经测试)。
我添加了一个 beforeSave() Parse 定义的云函数,但它无法正常工作。
这是背景: 我有一个名为 UserRewards 的 class,它有一个名为 user 的列,类型为 ParseRelation。它由 1 个关系组成,该关系具有 ParseUser 类型的单个对象。我有一个新列 pUser 我想在此函数中设置。它查找 user 关系,在其中找到 ParseUser,并将 pUser 设置为该用户。
这是我的代码
Parse.Cloud.beforeSave("UserRewards", function(request, response) {
var relation = request.object.relation("user");
relation.query().find({
success: function(list) {
console.log("looked up relation");
if (list.length > 0) {
var pUser = list[0];
request.object.set("pUser", pUser);
console.log("updated pUser");
}
},
error: function(error) {
console.error("unable to lookup relation");
}
});
response.success();
});
当我更新 UserRewards 行时,将调用此函数。但它什么都不做——没有任何控制台或错误日志。
有什么想法吗?
您的函数在查询完成之前运行 response.success(),从而取消它。尝试...
Parse.Cloud.beforeSave("UserRewards", function(request, response) {
var relation = request.object.relation("user");
relation.query().find({
success: function(list) {
console.log("looked up relation");
if (list.length > 0) {
var pUser = list[0];
request.object.set("pUser", pUser);
console.log("updated pUser");
}
response.success();
},
error: function(error) {
console.error("unable to lookup relation");
response.error(error);
}
});
});
或者,用 promises 更容易看...
Parse.Cloud.beforeSave("UserRewards", function(request, response) {
var relation = request.object.relation("user");
relation.query().find().then(function(list) {
console.log("looked up relation");
if (list.length > 0) {
var pUser = list[0];
request.object.set("pUser", pUser);
console.log("updated pUser");
}
response.success();
}, function(error) {
console.error("unable to lookup relation");
response.error(error);
});
});
EDIT 我想我理解后续问题是要求将指针属性与关系属性同步,假设在保存之前只设置了其中一个。这可以通过检测关系是否为空来完成。如果是,再执行一个异步步骤来获取指针...
Parse.Cloud.beforeSave("UserRewards", function(request, response) {
var relation = request.object.relation("user");
relation.query().find().then(function(list) {
console.log("looked up relation");
if (list.length > 0) {
var pUser = list[0];
request.object.set("pUser", pUser);
console.log("updated pUser");
return Parse.Promise.as(); // we're done, this will pass nothing to the next step
} else { // the relation is empty, so the user pointer must be set
var pointer = request.object.get("pUser");
return pointer.fetch(); // this will pass the pUser to the next step
}
}).then(function(pUser) {
if (pUser) {
// must have found an empty relation in the last step. add the user pointer to it
request.object.relation.add(pUser);
}
response.success();
}, function(error) {
console.error("unable to lookup relation");
response.error(error);
});
});
(注意代码未经测试)。