在对象的ACL中' Hotel'我想保存' Parse.User'宾语。我在beforeSave()中保存ACL。在保存对象时,它会给我一个错误,因为" Uncaught试图保存一个带有指向未保存的新对象的对象" 我无法解决。
分配用户功能:
exports.assignUser = function(params) {
if(!params || !params.userId || !params.id) {
console.log(Response.ParametersEmpty);
params.error(Response.EmptyParameters);
} else {
var Hotel = Parse.Object.extend('Hotel');
var dsQuery = new Parse.Query(Hotel);
dsQuery.equalTo('objectId', params.id);
dsQuery.first({
success: function(_hotel) {
if(_hotel) {
_hotel.set('tempAssignedUser', params.userId);
_hotel.add('users', params.userId);
_hotel.save(null, {
success: function(_hotel) {
params.success(_hotel);
},
error: function(_hotel, error) {
params.error(Response.InternalServerError);
}
});
} else {
params.error(Response.NotFound);
}
},
error: function(error) {
params.error(Response.InternalServerError);
}
});
}
};
beforeSave()
Parse.Cloud.beforeSave('Hotel', function(req, res) {
var hotel = req.object;
//CREATING AND SETTING ACLS TO Hotel
var hotelACL = new Parse.ACL();
**if(hotel.get('tempAssignedUser')) {
hotelACL.setWriteAccess(hotel.get('tempAssignedUser'), true);
hotelACL.setReadAccess(hotel.get('tempAssignedUser'), true);
hotel.unset('tempAssignedUser');
}** // If i remove this if condition, my code is working fine
hotelACL.setRoleWriteAccess('ADMIN', true);
hotelACL.setRoleReadAccess('ADMIN', true);
hotelACL.setRoleWriteAccess('SUPER_USER', true);
hotelACL.setRoleReadAccess('SUPER_USER', true);
hotelACL.setPublicReadAccess(true);
hotel.setACL(hotelACL);
res.success();
}
答案 0 :(得分:0)
首先确保hotel.get('tempAssignedUser')
为User类中存在的用户返回有效的objectId
。此外,我假设您的tempAssignedUser
课程中定义了一个名为Hotel
的字段。现在,您可以在beforeSave
:
Parse.Cloud.beforeSave('Hotel', function(req, res) {
var hotel = req.object;
var hotelACL = new Parse.ACL();
hotelACL.setRoleWriteAccess('ADMIN', true);
hotelACL.setRoleReadAccess('ADMIN', true);
hotelACL.setRoleWriteAccess('SUPER_USER', true);
hotelACL.setRoleReadAccess('SUPER_USER', true);
hotelACL.setPublicReadAccess(true);
if(hotel.get('tempAssignedUser')) {
// fetch the user object
Parse.Cloud.useMasterKey();
var userObject = new Parse.User();
userObject.id = hotel.get('tempAssignedUser');
userObject.fetch().then( function(user) {
hotelACL.setWriteAccess(user, true);
hotelACL.setReadAccess(user, true);
hotel.unset('tempAssignedUser');
hotel.setACL(hotelACL);
res.success();
}, function(error) {
response.error(error);
});
} else {
hotel.setACL(hotelACL);
res.success();
}
});
答案 1 :(得分:0)
您正在使用userId设置 tempAssignedUser 。这与使用 _User 对象设置 tempAssingedUser 不同。您正在做的是设置一个占位符,无论是否保存具有该ID的原始对象,该占位符都是“未保存的”。
您需要首先使用id params.userId 对 tempAssignedUser 进行FETCH,然后使用hotel.set设置酒店的属性(“tempAssignedUser” “,fetchedUser)