Parse.com Cloud Code beforeSave()错误:"未捕获尝试使用指向未保存的新对象的对象保存对象"

时间:2015-12-17 12:17:56

标签: javascript parse-platform cloud-code before-save

在对象的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();
}

2 个答案:

答案 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)