2016-12-31 11 views
2

私は現在作成中のこのWebサイトの管理パネルで作業していますので、Braintree経由で支払いを受け入れることができますが、顧客を取得する機能を実装する必要がありますヘッダーが送信されると、そのうちの1つだけを送信し、すべてを送信することはありません。 jsonを配列に結合して1つのヘッダを送信することは可能ですか?エラー:送信後にヘッダーを設定できません。Braintree

CODE:

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

これは単にブレーントリーのドキュメントに従っているとエラーが発生した理由を正確に私が知っています。どのような助けが本当に感謝して、私はあなたが詳細を知る必要がある場合私は叫び声を与えてくださいので説明でひどいです!

更新:私は別の方法を探ると思っていましたが、私は「応答」がIDの配列を返すことに気付きました。だから私はEJSを使ってすべてのものをループし、各トランザクションごとに別々のページを持っていきます。

+0

もし配列に変換できたら、私はEJSで間違いなくループすることができます。 – Ethan

+0

Braintreeの人たちがここにいるのですが、私は最後に見ましたが、電子メールによる彼らのテクニカルサポートは、前回私が使ったときにはかなり良いものでした。それを試してみてください。あなたの知る限り、彼らの文書は恐ろしいものです。 – Rob

+0

彼らは良いメールサポートを持っていますが、残念ながら彼らは新年のために閉鎖され、はいそれは恐ろしい笑です。 – Ethan

答えて

1

免責事項:私はブレインツリーのために働く:)

ロバートが指摘したように、あなたは一度だけ要求(Expressから、したがってエラー)ごとres.render(または要求をend応答のいずれかの方法を)呼び出すことができます。

残念ながらresponseを配列として扱うことはできませんので、search responsesと対話する2つの方法のいずれかを にする必要があります。

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}); 
     } 
    }) 
    }) 
}) 
:要求を終了するとき

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

代わりに、あなたが知っているeachからビルドしたトランザクションの配列を比較することresponseidsプロパティを使用することができます:それは明確であるので、私は個人的にストリームのアプローチを好みます

+0

ありがとうNick! – Ethan

1

ルートごとに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'メソッドを持つオブジェクトです(これは混乱します、そうです:)。 –

関連する問題