假设我有一个Users类和一个Posts类,每个Post对象都有一个User指针。我还有一个Comment类,每个Comment都有一个User指针。每当我获取用户时,我想获取用户在一个网络查询中所做的所有帖子和评论。复合子查询将无法工作,因为我有多种数据类型。理想情况下,我希望帖子和评论是检索到的用户对象的属性。
在Cloud Code中,是否有办法拦截对象请求并在发送到客户端之前将其修改为具有适当的属性?
答案 0 :(得分:1)
您无法在检索时修改对象,但您可以编写自己的云功能。在您的云功能中,您可以将用户的ID作为参数,然后通过将3个查询的输出组合成一个结果来创建复合对象。
您需要查询:
您可以获得每个查询的承诺(find()
等返回一个promise对象)并使用Parse.Promise.when(userQueryPromise, postQueryPromise commentQueryPromise)
构建您的复合对象并将其返回。
var _ = require('underscore');
Parse.Cloud.define('getUserWithPostsAndComments', function(request, response) {
var userId = request.params.userId;
var userPointer = new Parse.User();
userPointer.id = userId;
var userQuery = new Parse.Query(Parse.User);
var postQuery = new Parse.Query('Post');
postQuery.equalTo('user', userPointer);
var commentQuery = new Parse.Query('Comment');
commentQuery.equalTo('user', userPointer);
Parse.Promise.when(userQuery.get(userId), postQuery.find(), commentQuery.find())
.then(function(user, posts, comments) {
var composite = {
// User properties you want
name: user.get('username'),
email: user.get('email')
};
// Post properties you want
composite.posts = _.map(posts, function(post) {
return {
id: post.id,
title: post.get('title')
};
});
// Comment properties you want
composite.comments = _.map(comments, function(comment) {
return {
id: comment.id,
body: comment.get('bodyText')
};
});
// return the composite object
response.success(composite);
}, function(error) {
response.error(error);
});
});
或者上面的块然后可以返回原始结果,例如:
.then(function(user, posts, comments) {
return {
user: user,
posts: posts,
comments: comments
};
}, function(error) {
// etc...