![](/img/trans.png)
[英]Parse.com Cloud Code afterSave( ) Error: “Uncaught Tried to save an object with a pointer to a new, unsaved object.”
[英]Parse.com Cloud Code beforeSave( ) Error: “Uncaught Tried to save an object with a pointer to a new, unsaved object”
在對象“酒店”的ACL中,我試圖保存“ Parse.User”對象的ID。 我將ACL保存在beforeSave()中。 在保存對象時,它給我一個錯誤: “無法捕獲,試圖用一個指向新的未保存對象的指針保存對象”,我無法解決。
分配用戶功能:
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();
}
首先,確保hotel.get('tempAssignedUser')
為您的User類中存在的用戶返回有效的objectId
。 我還假設在您的Hotel
類中定義了一個名為tempAssignedUser
的字段。 現在,您可以在beforeSave
嘗試使用此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();
}
});
您正在使用用戶ID設置tempAssignedUser 。 這與通過_User對象設置tempAssingedUser 不同 。 您正在做的是設置一個占位符,無論是否保存具有該ID的原始對象,該占位符都將“未保存”。
您需要首先獲取tempAssignedUser id為params.userId,然后用hotel.set集酒店的財產(“tempAssignedUser”,fetchedUser)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.