我正在尝试从 braintree 服务器构建一个 api。引用此文档 https://developers.braintreepayments.com/javascript+node/reference/general/result-handling/search-results
要从他们的服务器访问所有交易,我必须返回一个 Node 流。
前
app.get('/project', function(req, res) {
if(req.user) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.user.id);
});
stream.on("ready", function () {
console.log(stream.searchResponse);
});
stream.on("data", function (data) {
res.json(data) // can't set headers after they are sent.
});
}
});
我知道流以 block 的形式返回数据,所以上面的 res.json()
很可能被多次调用导致 Error: Can't set headers after they are已发送
。
所以我的问题是如何将这些数据一次性发送给客户端? nodejs 流让我感到困惑,我将阅读更多相关内容,但了解如何在不重新发送 header 的情况下将数据发送到客户端会很棒。
最佳答案
除非您正在读取的流处于对象模式,否则您不应该对 data
事件做出任何假设。您可以获得一个或一百个 data
事件(当然取决于输入大小),因为 TCP 是一个流。
你可能想要的是这样的东西(假设 stream
不是对象模式):
app.get('/project', function(req, res) {
if(req.user) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.user.id);
});
stream.on("ready", function () {
console.log(stream.searchResponse);
});
var buf = '';
stream.on("data", function (data) {
buf += data;
});
stream.on("end", function() {
res.setHeader('Content-Type', 'application/json');
res.send(buf);
});
}
});
或者只是将流通过管道传递给响应:
app.get('/project', function(req, res) {
if(req.user) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.user.id);
});
stream.on("ready", function () {
console.log(stream.searchResponse);
});
res.setHeader('Content-Type', 'application/json');
stream.pipe(res);
}
});
对于一个对象流,你可能会这样做:
app.get('/project', function(req, res) {
if(req.user) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.user.id);
});
stream.on("ready", function () {
console.log(stream.searchResponse);
});
var result = [];
stream.on("data", function (data) {
result.push(data);
});
stream.on("end", function() {
res.json(result);
});
}
});
关于javascript - Nodejs 流(错误 : Can't set headers after they are sent),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556830/