Search code examples
node.jsswiftstripe-paymentsparse-serverparse-cloud-code

Swift wrongly reading Cloud Code error


I am trying to handle an error from a PFCloud function in Swift with if error != nil. Although neither the Cloud Code or Stripe return an error, Swift responds as if there was one.

Swift

PFCloud.callFunctionInBackground("authorize", withParameters: ["customer": self.customerID!, "cost": self.stripePrice, "type": self.stripeDescription) { (success: AnyObject?, error: NSError?) -> Void in
    print("Authorizing")
    if error != nil {
        print("authorizeError")
        self.displayAlert("Error", message: "There was an error authorizing your payment. Please try again later.")
    } else {
        if type == 1{
            print("one")
            self.performSegueWithIdentifier("one", sender: self)
            self.viewTimer.invalidate()
            self.cancelTimer.invalidate()
        } else {
            self.performSegueWithIdentifier("two", sender: self)
            print("two")
            self.viewTimer.invalidate()
            self.cancelTimer.invalidate()
        }
    }
}

Cloud Code (Node.js)

Parse.Cloud.define("authorize", function(request, response){
    var user = request.user;
    stripe.charges.create({ amount: request.params.cost, currency: "cad", customer: request.params.customer, capture: false}).then(function(charge) {
        user.set("chargeID", charge.id);
        return user.save(null, { useMasterKey: true });
    }).then(function(result) {
        console.log(charge);
        console.log(charge.id);
        response.success(charge); 
    }, function(err) {
        console.log(err);   
        console.log(charge.id)
        response.error(err);
    });
});

Solution

  • The problem is that you're trying to return charge in the success callback and charge is null. Change your code as follows:

    stripe.charges.create({ amount: request.params.cost, currency: "cad", customer: request.params.customer, capture: false}).then(function(charge) {
        user.set("chargeID", charge.id);
        return user.save(null, { useMasterKey: true });
    }).then(function(result) {
    
        // charge is undefined here.
        console.log(charge);
    
        // Return something besides charge
        response.success("unused result"); 
    }, function(err) {
        console.log(err);   
        console.log(charge.id)
        response.error(err);
    });