解析云-通过objectId获取用户信息
Parse Cloud - Get user informations by objectId
我正在尝试从 Parse Cloud 中的 User class 获取用户语言。 lang 是 User class 中的列之一。我想获得用户的 lang。我的整个云代码如下(没有用):
Parse.Cloud.beforeSave('Order', function(request, response) {
var orderState = request.object.get('orderState');
var subtitleMessage = '';
var userLang = '';
var currentUser = request.object.get('user');
var userQuery = new Parse.Query(Parse.User);
userQuery.equalTo('objectId', currentUser.id);
.find()
.then((result)=>{
userLang = result.get('lang');
})
if (orderState === undefined || ['nonApproved', 'approved', 'delivered', 'canceled'].indexOf(orderState) < 0) {
response.error("OrderState is null or not one the ['nonApproved', 'approved', 'delivered', 'canceled']!");
} else {
var query = new Parse.Query(Parse.Installation);
query.include('user');
query.equalTo('user', request.object.get('user'));
Parse.Push.send(
{
where: query,
data: {
title: "MyTitle",
alert: subtitleMessage
}
},
{
success: function() {
},
error: function(error) {
response.error(error)
},
useMasterKey: true
}
);
response.success();
}
});
验证你确实有一个来自 request.object.get("user");
的用户对象 shell 而且,如果你这样做,你可以只调用 currentUser.fetch()
而不是执行查询,除非你有其他对象可能需要包括。
因为您使用了查询,所以结果是一个数组,即使只返回一个对象(或 none,也只是 []
)。所以,你正在做 Array.get("lang")
,这不应该做任何事情。尝试 if( results && results.length > 0 ) user = results[0];
,然后您应该可以访问 user.get("lang");
您应该为您的用户设置 ACL/CLP class。理想情况下,这些不应该被非用户或主人的人访问。因此,如果设置正确,您的解决方案可能会将 {useMasterKey:true}
作为查询/获取的选项传递。
Jake T. 的回答有一些优点。根据他的回答和你对问题的评论,你可以尝试这样的事情:
Parse.Cloud.beforeSave('Order', function(request, response) {
var currentUser = request.object.get('user');
currentUser.fetch({useMasterKey: true}).then(function(user) {
var userLang = user.get('lang');
// send push notifications based on userLang here
response.success();
}).catch(function(error) {
// handle any errors here
console.error(error);
});
});
我正在尝试从 Parse Cloud 中的 User class 获取用户语言。 lang 是 User class 中的列之一。我想获得用户的 lang。我的整个云代码如下(没有用):
Parse.Cloud.beforeSave('Order', function(request, response) {
var orderState = request.object.get('orderState');
var subtitleMessage = '';
var userLang = '';
var currentUser = request.object.get('user');
var userQuery = new Parse.Query(Parse.User);
userQuery.equalTo('objectId', currentUser.id);
.find()
.then((result)=>{
userLang = result.get('lang');
})
if (orderState === undefined || ['nonApproved', 'approved', 'delivered', 'canceled'].indexOf(orderState) < 0) {
response.error("OrderState is null or not one the ['nonApproved', 'approved', 'delivered', 'canceled']!");
} else {
var query = new Parse.Query(Parse.Installation);
query.include('user');
query.equalTo('user', request.object.get('user'));
Parse.Push.send(
{
where: query,
data: {
title: "MyTitle",
alert: subtitleMessage
}
},
{
success: function() {
},
error: function(error) {
response.error(error)
},
useMasterKey: true
}
);
response.success();
}
});
验证你确实有一个来自 request.object.get("user");
的用户对象 shell 而且,如果你这样做,你可以只调用 currentUser.fetch()
而不是执行查询,除非你有其他对象可能需要包括。
因为您使用了查询,所以结果是一个数组,即使只返回一个对象(或 none,也只是 []
)。所以,你正在做 Array.get("lang")
,这不应该做任何事情。尝试 if( results && results.length > 0 ) user = results[0];
,然后您应该可以访问 user.get("lang");
您应该为您的用户设置 ACL/CLP class。理想情况下,这些不应该被非用户或主人的人访问。因此,如果设置正确,您的解决方案可能会将 {useMasterKey:true}
作为查询/获取的选项传递。
Jake T. 的回答有一些优点。根据他的回答和你对问题的评论,你可以尝试这样的事情:
Parse.Cloud.beforeSave('Order', function(request, response) {
var currentUser = request.object.get('user');
currentUser.fetch({useMasterKey: true}).then(function(user) {
var userLang = user.get('lang');
// send push notifications based on userLang here
response.success();
}).catch(function(error) {
// handle any errors here
console.error(error);
});
});