簡體   English   中英

Parse.com雲代碼beforeSave()錯誤:“未捕獲,試圖使用指向新的未保存對象的指針來保存對象”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM