4

My Parse cloud code is not responding with an error or success. It just times out, I don't know what I'm doing wrong. It should save multiple values in different tables, and finish with sending a push message to a user.

The push message and user table are adjusted and send, but the street and the ledger objects are not being saved correctly. Also the response is not being called.

I did work in the past (or I was just lucky). Any thought on what I'm doing wrong?

  var buyerId = request.params.buyerid;
  var sellerName = request.params.sellername;
  var streetId = request.params.streetid;
  var amount = request.params.amount;
  var pushMessageTemplate = request.params.pushMessage;

  var log = request ? request.log : console;
  var Streets = Parse.Object.extend('SHStreets');
  var streetQuery = new Parse.Query(Streets);
  streetQuery.equalTo("objectId", streetId);
  streetQuery.first({
    useMasterKey: true,
    success: function (street) {
      var streetName = street.get("name");

      var query = new Parse.Query(Parse.User);
      query.equalTo("objectId", buyerId);
      query.first({
        useMasterKey: true,
        success: function (user) {
          var promises = [];
          var now = new Date();

          var buyerName = user.get("username");
          // Set and save the change
          user.set("balance", user.get("balance") - amount);
          user.set("streets", user.get("streets") + 1);

          street.set("current_owner", user);
          street.set("owned_since", now);
          street.set("for_sale", false);
          street.set("price_bought", amount);

          var acl = new Parse.ACL();
          acl.setPublicReadAccess(true);
          acl.setWriteAccess(user, true);
          street.setACL(acl);

          //update ledger
          var Ledger = Parse.Object.extend("Ledger");
          var ledger = new Ledger();

          ledger.set("type", "buy");
          ledger.set("amount", amount);
          ledger.set('ledger_time', now);
          ledger.set("user", user);
          ledger.set("description", "x");

          promises.push(Parse.Object.saveAll([street, user, ledger], { useMasterKey: true }));

          // Find users with a given email
          var userQuery = new Parse.Query(Parse.User);
          userQuery.equalTo("objectId", user.id);

          var pushQuery = new Parse.Query(Parse.Installation);
          pushQuery.exists("user"); // filter out installations without users
          pushQuery.include('user'); // expand the user pointer
          pushQuery.matchesQuery("user", userQuery);

          // Send push notification to query
          promises.push(Parse.Push.send({
            where: pushQuery, // Set our installation query
            data: {
              alert: _.template(pushMessageTemplate)({
                sellername: sellerName,
                streetname: streetName,
                amount: amount
              })
            }
          }, {
              useMasterKey: true,
          }));

          return Parse.Promise.when(promises).then(function () {
            response.success("success");
          });
        },
        error: function (error) {
          log.error('buy-street error', error.message);
          response.error("Uh oh, buy request success failed." + error.message);
        }
      });
    },
    error: function (error) {
      log.error('buy-street error', error.message);
      response.error("Uh oh, buy request success failed." + error.message);
    }
  });
Lengo
  • 342
  • 7
  • 14

2 Answers2

1

It looks like your first query's success function doesn't return anything:

streetQuery.first({
useMasterKey: true,
success: function (street) { // this function doesn't return anything
  // ...
  query.first({  // You probably want to return this promise
    useMasterKey: true,
    success: function (user) { // this is the function that you're returning to
      // ...
      return Parse.Promise.when(promises).then(function () {
        response.success("success");
      });
    },
  });
}

});

Javascript will return undefined by default if you don't have a return statement.

adamdport
  • 11,687
  • 14
  • 69
  • 91
  • Thanks for your reply, i'm not really getting what's different in your answer, i'm return `Parse.Promise.when(promises).then(function ()` right? – Lengo Aug 07 '17 at 18:22
  • The code in my answer is identical to yours, just highlighting the points of interest. The line that says "you probably want to return this promise" should be `return query.first({` – adamdport Aug 07 '17 at 19:18
  • @Lengo does that make sense? – adamdport Aug 08 '17 at 17:47
  • It does make sense, but it's not fixing my problem in this case. Thanks for you help. – Lengo Aug 15 '17 at 18:43
0

I was missing a function error for the return of the promises.

 return Parse.Promise.when(promises).then(function () {
    // Set the job's sucess status
    response.success('success');
 },function(error) {
    response.error(error);
 });
Lengo
  • 342
  • 7
  • 14