Search code examples
javascriptnode.jssails.jsbraintree

Sails + Braintree : Unable to send the transactions details to client


I'm developing an application using Sails JS and Braintree. I'm trying to send the all past transaction details that the customer has made.

Here is my getTransaction action

getTransaction: function(req, res) {
    var customerId = req.param('customerId');
    var gateway = setUpGateway();
    var stream = gateway.transaction.search(function(search) {
        search.customerId().is(customerId);
    }, function(err, response) {
        if (err) {
            return res.serverError(err);
        }          

        res.send(response);
    });
},

But the problem is, if I directly send the response which I got from braintree server, it throws the circular dependency error. So, to overcome that error I'm fetching only those details that I need from response like this

getTransaction: function(req, res) {
        var customerId = req.param('customerId');
        var gateway = setUpGateway();
        var stream = gateway.transaction.search(function(search) {
            search.customerId().is(customerId);
        }, function(err, response) {
            if (err) {
                return res.serverError(err);
            }

            var transactions = [];
            response.each(function(err, transaction) {
                var temp = [];

                temp.push(transaction.id);
                temp.push(transaction.amount);
                temp.push(transaction.createdAt);
                transactions.push(temp);
            });

            res.send(transactions);
        });
    },

But here the .each function is getting executed asynchronously and hence res.send returns the empty array. So what should I do to return all the transaction that the user has made?


Solution

  • Full disclosure: I work at Braintree. If you have any further questions, feel free to contact our support team.

    You are correct that the iterator executes asynchronously. You should use Node's stream semantics to process the request

    getTransaction: function(req, res) {
      var customerId = req.param('customerId');
      var gateway = setUpGateway();
      var transactions = [];
    
      var stream = gateway.transaction.search(function(search) {
        search.customerId().is(customerId);
      });
    
      stream.on('data', function (transaction) {
        transactions.push(transaction);
      });
    
      stream.on('end', function () {
        res.send(transactions);
      });
    },
    

    This will wait until all transactions have been processed before sending the result.

    This page provides more information about searching using our Node client library and Node's Stream API.