Sails + Braintree:无法将交易详细信息发送给客户

时间:2016-03-03 16:12:58

标签: javascript node.js sails.js braintree

我正在使用Sails JSBraintree开发应用程序。我试图发送客户所做的所有过去的交易细节。

这是我的getTransaction操作

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);
    });
},

但问题是,如果我直接发送我从braintree服务器获得的响应,它会抛出circular dependency error。因此,为了克服这个错误,我只能从这样的响应中获取我需要的那些细节

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);
        });
    },

但是这里.each函数异步执行,因此res.send返回空数组。那么我应该怎么做才能返回用户所做的所有交易呢?

1 个答案:

答案 0 :(得分:2)

完全披露:我在Braintree工作。如果您有任何其他问题,请随时与我们的support小组联系。

迭代器异步执行是正确的。您应该使用Node的流语义来处理请求

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 page提供了有关使用我们的Node客户端库和Node的Stream API进行搜索的更多信息。