Skip to content

Cloud code save object doesn't work #3399

Closed

Description

@rusmichal

Issue Description

I use promises to create Balance object for each new user but it seems to balance.save(..) doesn't work.

Line: balancePromise.push(balance.save(null, { useMasterKey: true }));

Describe your issue in as much detail as possible.

Maybe from beginning.:

  1. query object call to check if balance has already exist.
  2. If there isn't I create 'Admin' role query and push adminQuery into adminPromises array and return call with that promieses. (Balance can change onlny admin)
  3. When I get role I create balance and push that operation into balancePromise array and call
    Parse.Promise.when(balancePromise) and after this I got nothing. Take a look on logs.

****** balance log is the last before save balance. After this got nothing, no errors etc.

nfo: afterSave triggered for _User for user DtTd6iR3TU:
2017-01-19T12:39:15.894297+00:00 app[web.1]:   Input: {"email":"dff@fgg.mkpp","username":"dff@fgg.mkpp","profile_picture_url":"none","createdAt":"2017-01-19T12:39:15.483Z","updatedAt":"2017-01-19T12:39:15.878Z","ACL":{"*":{"read":true},"DtTd6iR3TU":{"read":true,"write":true}},"system":"android","version":"ALE-L21, 23  6.0, staging-2.5","objectId":"DtTd6iR3TU"} className=_User, triggerType=afterSave, user=DtTd6iR3TU
2017-01-19T12:39:15.930441+00:00 app[web.1]: ***** Found role
2017-01-19T12:39:15.930812+00:00 app[web.1]: ****** balance2 ParseObject { _objCount: 14, className: 'Balance' }
2017-01-19T12:39:15.930848+00:00 app[web.1]: ****** acl
2017-01-19T12:39:15.930930+00:00 app[web.1]: ****** balance
2017-01-19T12:39:15.942114+00:00 app[web.1]: user {"triggerName":"beforeSave","object":{"ACL":{},"owner":"DtTd6iR3TU","currency":"pln","amount":0},"master":true,"log":{"appId":"DOo6g0IS8NXyv6AP2SV59ehXaVX14XZXcXqukvlZ"},"installationId":"8b4ba0b8-9ad1-b28d-5908-204bb9187deb"}

If I remove balance.save(..) then next promises are called.

Steps to reproduce

Parse.Cloud.afterSave(Parse.User, function (request) {
    var user = request.object.id;
    
    var query = new Parse.Query("Balance");
    query.equalTo("owner", user);

    var adminQuery = new Parse.Query(Parse.Role);
    adminQuery.equalTo("name", "Administrator");

    var clientQuery = new Parse.Query(Parse.Role);
    clientQuery.equalTo("name", "Client");

    var clientPromises = [];
    var adminPromises = [];
    var balancePromise = [];

    query.first({ useMasterKey: true }).then(function(object) {
        if (typeof object === 'undefined') {
            adminPromises.push(adminQuery.first({useMasterKey: true}));
        } else {
            console.log("Balance already exists");
        }

        clientPromises.push(clientQuery.first({useMasterKey: true}));

        return Parse.Promise.when(adminPromises);
    }).then(function(role) {
        console.log('***** Found role'); 

        if(role) {
            var balance = new Parse.Object("Balance");
            balance.set("owner", user);

            //TODO parametrize it later
            balance.set("currency", "pln");
            balance.set("amount", 0);

            console.log('****** balance2', balance);
            var acl = new Parse.ACL();

            /*acl.setPublicReadAccess(false);
            acl.setPublicWriteAccess(false);
            acl.setReadAccess(user, true);
            acl.setReadAccess(role, true);
            acl.setWriteAccess(role, true);*/

            console.log('****** acl');

            balance.setACL(acl);
            console.log('****** balance');

            balancePromise.push(balance.save(null, { useMasterKey: true }));
        } else{
            console.log('errorrrrrr');
            status.error(error);
            //response.error("Failed " + error.code + ". " + error.message);
        }
 
        return Parse.Promise.when(balancePromise);    // nothing get after this
    }).then(function (success) {
        console.log('****** rolesssss');
        return Parse.Promise.when(rolePromises);
    }).then(function (object) {
        console.log('****** objectssssss', JSON.stringify(object));
        
        console.log('****** object', JSON.stringify(object));
        console.log('create relation');    // didn't appear
        object.relation("users").add(request.object.id);
        return object.save(null, { useMasterKey: true });
    }).then(function(result) {
        console.log("Successfullyyyyyyyyyyyy");
        response.success("Successfully created user with balance");
    }, function(error) {
        console.log("Erorrrrrrrrrr" + JSON.stringify(error));
        response.error("Could not save changes to user!" + error);
    });
});

Expected Results

Save balance object and call next steps of promises chain.

Actual Outcome

Cannot save balance object.

Environment Setup

  • Server

    • parse-server version : 2.3.1
    • Operating System: Heroku Linux
    • Hardware: Heroku Dyno
    • Localhost or remote server? (AWS, Heroku, Azure, Digital Ocean, etc): Heroku
  • Database

    • MongoDB version: 3.2.11
    • Storage engine: Unknown
    • Hardware: Unknown
    • Localhost or remote server? (AWS, mLab, ObjectRocket, Digital Ocean, etc): mLab

Logs/Trace

You can turn on additional logging by configuring VERBOSE=1 in your environment.

Logs above.

Activity

  1. MartinHerman commented on Jan 25, 2017

    @MartinHerman

    I'm pretty sure that you are not properly creating the Balance Parse.Object.

    Try to initialize it like this:

    var Balance = Parse.Object.extend("Balance");
    var balance = new Balance();
    
  2. natanrolnik commented on Jan 26, 2017

    @natanrolnik
    Contributor

    @rusmichal try with @MartinHerman's suggestion. Same is found in the docs:

    // Simple syntax to create a new subclass of Parse.Object.
    var GameScore = Parse.Object.extend("GameScore");
    
    // Create a new instance of that class.
    var gameScore = new GameScore();
    

    We'll reopen if you find the bug happens also creating the object this way.

  3. rusmichal commented on Feb 2, 2017

    @rusmichal
    Author

    I figured it out. I had beforeSave for Balance and something was wrong with that method. I got always silent crash without error message.

    Thx guys for help :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions