2016-12-31 8 views
2

В настоящее время я работаю над панелью администратора для этого веб-сайта, которую я создаю, поэтому я могу принимать платежи через Braintree, но мне нужно реализовать возможность извлечения клиентов транзакций, но как только заголовок отправлен, он отправляет только один из них, а не все. Можно ли комбинировать json с массивом, чтобы он отправил в один заголовок?Ошибка: не удается установить заголовки после их отправки Braintree

КОД:

router.get('/:cid/test', function(req, res) { 
    var stream = gateway.transaction.search(function (search) { 
    search.customerId().is(req.params.cid); 
    }, function (err, response) { 
    response.each(function (err, transaction) { 
     return res.render('admin/test', {transaction: transaction}); 
    }); 
    }); 
}); 

Это только после документации Braintree, и я точно знаю, почему происходит ошибка. Любая помощь действительно оценена, и я ужасно объясняю, поэтому, если вам нужно знать больше информации, пожалуйста, дай мне крик!

UPDATE: Итак, я подумал, что я изучу другой метод, и я заметил, что «ответ» возвращает массив идентификаторов. Поэтому я просто использую EJS, чтобы пропустить все это, а затем создать отдельную страницу для каждой транзакции.

+0

Если он может быть преобразован в массив, я определенно мог бы перебрать его с помощью EJS. – Ethan

+0

Люди с Braintree болтаются здесь, последние, что я видел, но их техническая поддержка по электронной почте была довольно хорошей в прошлый раз, когда я ее использовал. Вы должны попробовать это. Их документация ужасна, как вы узнали. – Rob

+0

У них хорошая поддержка по электронной почте, но, к сожалению, они закрыты на Новый год, и да, это ужасно. – Ethan

ответ

1

Отказ от ответственности: Я работаю Брэйнтри :)

Как отметил Роберт, вы можете вызвать только res.render (или любой из методов реагирования, которые end запрос) один раз в запросе (отсюда ошибки от курьерского).

К сожалению, вы не можете рассматривать response как массив, так что вам нужно будет использовать один из двух документированных способов взаимодействия с search responses. Я лично предпочитаю подход потоков, потому что это понятнее:

app.get('/stream', function (req, res) { 
    var transactions = [] 
    var transactionStream = gateway.transaction.search(function (search) { 
    search.customerId().is(req.params.cid); 
    }) 

    transactionStream.on('data', function (transaction) { 
    transactions.push(transaction) 
    }) 

    transactionStream.on('error', function() { /* handle errors */ }) 

    transactionStream.on('end', function() { 
    res.json({transactions: transactions}); 
    }) 
}) 

В качестве альтернативы, вы можете использовать ids свойство response сравнить массив сделок, которые вы строите из each знать, когда закончится запрос:

app.get('/calback', function (req, res) { 
    var transactionStream = gateway.transaction.search(function (search) { 
    search.customerId().is(req.params.cid); 
    }, function (err, response) { 
    var transactions = [] 
    response.each(function (err, transaction) { 
     transactions.push(transaction) 
     if (transactions.length === response.ids.length) { 
     res.json({transactions: transactions}); 
     } 
    }) 
    }) 
}) 
+0

Спасибо, Ник! – Ethan

1

Вы можете сделать только один ответ по одному маршруту. Таким образом, вы можете вызвать только один раз, а не в цикле:

res.render('admin/test', {transaction: transaction}); }); 

Вы можете использовать каждый метод для перебора ответ и создать результат:

var transactions =[]; 
response.each(function (err, transaction) { transactions.push(transaction) }); 
return res.render('admin/test', {transaction: transactions}); 

Это будет работать, если каждый метод синхронный. Если это не так (и Ник знал бы), используйте нижеприведенное решение.

+0

К сожалению, 'response' не является массивом здесь, это объект с методом' each' (это запутанно, да :)) –

Смежные вопросы